js自定义事件的简单实现

在写这段代码之后,本人使用过jQuery这个库,一直对jQuery的自定义事件有疑惑,就看了看jQuery的源码,廓然开朗。

jQuery代码实现和触发自定义实现如下: 

jQuery的定义方式:
$(dom).bind('data-change',function(){//dom为一个html元素
      alert("asd");     
})

jQuery使用方式 : 
$(dom).trigger('init-change',[data]);

但内部机制是怎么触发这个事件的呢?原来jQuery通过的是缓存这些自定义事件,我就自己实现了一把,下面是我的代码:

 

var Dojo = function(selecter,context){
    return new this.init(selecter,context);//创建一个新的对象
}
Dojo.prototype.event = {};
Dojo.prototype.init  = function(selecter,context){
    this.gid = 0;
    var dom  = this.getDom(selecter); 
    this.dom = dom;
    this.dom.gid = this.gid++;
    return this;
}
Dojo.prototype.getDom =  function(selecter){
    var dom = document.getElementById(selecter) || null;
    return [dom];
}
Dojo.prototype.addEvent = function(eventName,fn){//存放自定义的事件
    if(!this.event[eventName]){
        this.event[eventName] = [];
    }
    this.event[eventName].push( fn );
}
//Dojo工具类
Dojo.Util = {};
Dojo.Util.isFunction = function(fn){
    return Object.prototype.toString.call( fn ).slice(8,-1) === 'Function';
}
Dojo.Util.ToArray = function(args){
    return Array.prototype.slice.call( args , 0 );
}
//简单实现事件的绑定
Dojo.prototype.click = function(fn){
    this.event[this.dom.gid] = this.event[this.dom.gid] || [];
    var i = j = 0;
    var self = this;
    if(Dojo.Util.isFunction( fn )){
        for(;i<this.dom.length;i++){
            this.dom[i].addEventListener('click' , function(e,data){
                fn.call(self,e,data);        
            } ,false);
        }
    }

}
Dojo.prototype.trigger = function(eventName,data){
    var i = 0;
    if(!this.event[eventName]){
        return;
    }
    for(len = this.event[eventName].length;i<len;i++){
        this.event[eventName][i].apply(this.dom,data);
    }
    return this;
}
Dojo.prototype.init.prototype = Dojo.prototype;
var dom = new Dojo('dom');
//为创建的dom对象增加自定义函数
//这里面就增加了两个一样的事件
dom.addEvent("data-change",function(){
    console.log(arguments);        
});
dom.addEvent("data-change",function(){
    var arr;
    arr = Dojo.Util.ToArray(arguments);  
    alert(arr);        
});
//click的时候触发事件
dom.click(function(e){
    this.trigger("data-change",['a','c','d']);
});

 

  

  

转载于:https://www.cnblogs.com/lztkiss/archive/2013/02/06/2906740.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript 中,可以通过自定义事件实现组件之间的通信。自定义事件实现主要分为以下几个步骤: 1. 创建事件对象:可以使用 Event 或 CustomEvent 构造函数来创建事件对象,其中 CustomEvent 可以传递自定义数据。 2. 触发事件:通过 dispatchEvent 方法来触发事件,可以将事件对象作为参数传递给该方法。 3. 监听事件:通过 addEventListener 方法来监听事件,可以指定事件类型和事件处理函数。 下面是一个简单的示例: ```javascript // 创建事件对象 const event = new CustomEvent('customEvent', { detail: { message: 'Hello, world!' } }); // 触发事件 document.dispatchEvent(event); // 监听事件 document.addEventListener('customEvent', function(event) { console.log(event.detail.message); }); ``` 在这个示例中,我们首先创建了一个名为 customEvent 的自定义事件,通过 detail 属性传递了自定义数据。然后使用 dispatchEvent 方法触发事件,并将事件对象作为参数传递给该方法。最后,使用 addEventListener 方法来监听事件,当 customEvent 事件被触发时,会输出事件对象的 detail 属性中的 message 值。 在 React 中,可以通过在组件中使用 componentDidMount 和 componentWillUnmount 方法来监听和取消监听自定义事件。例如: ```javascript class MyComponent extends React.Component { componentDidMount() { document.addEventListener('customEvent', this.handleCustomEvent); } componentWillUnmount() { document.removeEventListener('customEvent', this.handleCustomEvent); } handleCustomEvent = (event) => { console.log(event.detail.message); } render() { return <div>My Component</div>; } } ``` 在这个示例中,我们在 MyComponent 组件的 componentDidMount 方法中添加了对 customEvent 自定义事件的监听,使用 handleCustomEvent 方法来处理事件。在 componentWillUnmount 方法中,我们取消了对该事件的监听,以避免在组件卸载之后仍然执行事件处理函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值