js 사용자 정의 이벤트의 간단한 실현

7276 단어 사용자 정의
이 코드를 쓴 후에 저는 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']);
});

 
  

좋은 웹페이지 즐겨찾기