标准dom添加事件是用addEventListener,ie6-8则是attachEvent。浏览器
今天写了一个兼容二者的添加事件函数,而且支持同时绑定多种事件类型,代码以下:dom
1 var addEvent = (function() { 2 if(window.addEventListener) { 3 return function(elem, type, fn, capture) { 4 if(type.indexOf(",") !== -1) { 5 var types = type.split(/(?:\s+)?\,(?:\s+)?/); 6 for(var i = 0; i < types.length; i++) { 7 elem.addEventListener(types[i], fn, capture); 8 } 9 } else { 10 elem.addEventListener(type, fn, capture); 11 } 12 } 13 } else { 14 return function(elem, type, fn, capture) { 15 if(type.indexOf(",") !== -1) { 16 var types = type.split(/(?:\s+)?\,(?:\s+)?/); 17 for(var i = 0; i < types.length; i++) { 18 elem.attachEvent('on' + types[i], fn); 19 } 20 } else { 21 elem.attachEvent('on' + type, fn); 22 } 23 } 24 } 25 })();
值得说一下的是这个addEvent函数是经过一个自执行函数定义的。
自执行函数里面先是判断浏览器是否支持addEventListener,若是支持就返回一个函数,这个函数里面是利用addEventListener绑定事件的。若是不支持addEventListener,也返回一个函数,而这个函数是利用attachEvent来绑定事件的。函数
此外还支持同时绑定多种事件类型,经过分号隔开:spa
1 addEvent(window, 'load, click, mousedown', function() {
//事件触发后执行
}, false);
小细节:由于attachEvent不支持事件捕获,因此绑定的时候直接忽略capture参数。code
1 elem.attachEvent('on' + types[i], fn);