JavaScript事件绑定

2016-09-23  本文已影响66人  Mike_Gu

本文介绍一些JavaScript事件绑定的常用方法及其优缺点,同时在最后展示一个由 Dean Edwards 写的一个比较完美的事件绑定方案。

传统方式

element.onclick = function(e){ // ... };

1.非常简单和稳定,可以确保它在你使用的不同浏览器中运作一致;
2.处理事件时,this关键字引用的是当前元素,这很有帮助;

1.传统方法只会在事件冒泡中运行,而非捕获和冒泡;
2.一个元素一次只能绑定一个事件处理函数。新绑定的事件处理函数会覆盖旧的事件处理函数;
3.事件对象参数(e)仅非IE浏览器可用;

W3C方式

element.addEventListener('click', function(e){ // ... }, false);

IE方式

element.attachEvent('onclick', function(){ // ... });

Dean Edwards的方案(addEvent/removeEvent库)

function addEvent(elementment, type, handler) { // 为每个事件处理函数赋予一个独立的ID if(!handler.$$guid) handler.$$guid = addEvent.guid++; // 为元素建立一个事件类型的散列表 if(!elementment.events) elementment.events = {}; // 为每对元素/事件建立一个事件处理函数的散列表 var handlers = elementment.events[type]; if(!handlers) { handlers = elementment.events[type] = {}; // 存储已有的事件处理函数(如果已存在一个) if(elementment["on" + type]) { handlers[0] = elementment["on" + type]; } } // 在散列表中存储该事件函数 handlers[handler.$$guid] = handler; // 赋予一个全局事件处理函数来出来所有工作 elementment["on" + type] = handleEvent; } // 创建独立ID的计数器 addEvent.guid = 1; function removeEvent(elementment, type, handler) { // 从散列表中删除事件处理函数 if(elementment.events && elementment.events[type]) { delementte elementment.events[type][handler.$$guid]; } } function handleEvent(event) { var returnValue = true; // 获取事件对象(IE使用全局的事件对象) event = event || fixEvent(window.event); // 获取事件处理函数散列表的引用 var handlers = this.events[event.type]; // 依次执行每个事件处理函数 for(var i in handlers) { this.$$handerEvent = handlers[i]; if(this.$$handlerEvent(event) === fasle) { returnValue = false; } } return returnValue; } // 增加一些IE事件对象缺乏的方法 function fixEvent(event) { event.preventDefault = fixEvent.preventDefault; event.stopPropagation = fixEvent.stopPropagation; return event; } fixEvent.preventDefault = function() { this.returnValue = false; } fixEvent.stopPropagation = function() { this.cancelBubble = true; }

上一篇 下一篇

猜你喜欢

热点阅读