深入了解javascript事件 -自定义事件绑定

上一节分析了3种的事件绑定的优缺点,今天我们来写一个通用的能适合各种浏览器的事件绑定函数。

这里我们不重新写了,综合网上各种比较好的通用事件绑定函数,我这里采用大师 Dean Edwards事件绑定代码,请大家详细看下面的注释

   

  function addEvent(element, type, handler) {
             // 给函数分配唯一的标志ID
             if (!handler.$$guid) handler.$$guid = addEvent.guid++;
             // 创建一个hash table来保存各种事件的处理函数  
             if (!element.events) element.events = {};
             // 创建一个hash table来保存某个事件处理函数
             var handlers = element.events[type];
             if (!handlers) {
                handlers = element.events[type] = {};
                 // 储存已经存在的事件处理函数
                 if (element["on" + type]) {
                    handlers[0] = element["on" + type];
                }
            }
             //  保存时间处理函数到hash table中
            handlers[handler.$$guid] = handler;
             //  为事件提供一个统一全局的处理函数 这句是关键handleEvent函数属于element,也就是说函数的内部this是指向element
            element["on" + type] = handleEvent;
        };
        addEvent.guid = 1;
         function removeEvent(element, type, handler) {
             //  移除 
             if (element.events && element.events[type]) {
                 delete element.events[type][handler.$$guid];
            } 
        };
         function handleEvent(event) {
            // 获取事件对象
            event = event || window.event;
             //  注意这里的this指向dom元素 因为addEvent中element["on" + type] = handleEvent
              // 获取已经缓存到dom元素的events属性的各个事件函数
             var handlers =  this.events[event.type];
             // 遍历各个函数
             for ( var i  in handlers) {
                 //  注意这里的this指向dom元素 所有实际的处理函数变成element的一个内部处理函数 
                 //  所以函数内部this指向dom元素
                 this.$$handleEvent = handlers[i];
                 // 触发函数
                 this.$$handleEvent(event);
            } 
        };  

 

使用方法代码如下:

   
  < script  type ="text/javascript" >

        window.onload =  function () {
             var tt = document.getElementById("sfs");
       
            addEvent(tt, "click", t1);
            addEvent(tt, "click", t2);
        }
         function t1() {
             var i =  this;
        }
         function t2() {
             var i =  this;
        }

         function addEvent(element, type, handler) {
             // 给函数分配唯一的标志ID
             if (!handler.$$guid) handler.$$guid = addEvent.guid++;
             // 创建一个hash table来保存各种事件的处理函数  
             if (!element.events) element.events = {};
             // 创建一个hash table来保存某个事件处理函数
             var handlers = element.events[type];
             if (!handlers) {
                handlers = element.events[type] = {};
                 // 储存已经存在的事件处理函数
                 if (element["on" + type]) {
                    handlers[0] = element["on" + type];
                }
            }
             //  保存时间处理函数到hash table中
            handlers[handler.$$guid] = handler;
             //  为事件提供一个统一全局的处理函数 这句是关键handleEvent函数属于element,也就是说函数的内部this是指向element
            element["on" + type] = handleEvent;
        };
        addEvent.guid = 1;
         function removeEvent(element, type, handler) {
             //  移除 
             if (element.events && element.events[type]) {
                 delete element.events[type][handler.$$guid];
            } 
        };
         function handleEvent(event) {
            // 获取事件对象
            event = event || window.event;
             //  注意这里的this指向dom元素 因为addEvent中element["on" + type] = handleEvent
              // 获取已经缓存到dom元素的events属性的各个事件函数
             var handlers =  this.events[event.type];
             // 遍历各个函数
             for ( var i  in handlers) {
                 //  注意这里的this指向dom元素 所有实际的处理函数变成element的一个内部处理函数 
                 //  所以函数内部this指向dom元素
                 this.$$handleEvent = handlers[i];
                 // 触发函数
                 this.$$handleEvent(event);
            } 
        };  
     </ script >
</ head >
< body >
   < div   style =" height:800px; width:800px; background:red; border:20px solid black; padding:50px;" >
   < div   id ="sfs"  style ="height:200px; width:200px; background:green; position:relative; " >safsasafss </ div >

  </div> 

你可能感兴趣的:(JavaScript)