正确使用addEventListener()/ attachEvent()?
我想知道如何正确使用addEventListener
分别attachEvent
?
window.onload = function (myFunc1) { /* do something */ } function myFunc2() { /* do something */ } if (window.addEventListener) { window.addEventListener('load', myFunc2, false); } else if (window.attachEvent) { window.attachEvent('onload', myFunc2); } // ...
要么
function myFunc1() { /* do something */ } if (window.addEventListener) { window.addEventListener('load', myFunc1, false); } else if (window.attachEvent) { window.attachEvent('onload', myFunc1); } function myFunc2() { /* do something */ } if (window.addEventListener) { window.addEventListener('load', myFunc2, false); } else if (window.attachEvent) { window.attachEvent('onload', myFunc2); } // ...
?
这是跨浏览器的安全,还是我应该更好地去这样的事情:
function myFunc1(){ /* do something */ } function myFunc2(){ /* do something */ } // ... function addOnloadEvent(fnc){ if ( typeof window.addEventListener != "undefined" ) window.addEventListener( "load", fnc, false ); else if ( typeof window.attachEvent != "undefined" ) { window.attachEvent( "onload", fnc ); } else { if ( window.onload != null ) { var oldOnload = window.onload; window.onload = function ( e ) { oldOnload( e ); window[fnc](); }; } else window.onload = fnc; } } addOnloadEvent(myFunc1); addOnloadEvent(myFunc2); // ...
AND:说myfunc2
只适用于IE 7。 如何相应地修改正确/首选的方法?
两者的用法是相似的,虽然两者对事件参数的语法略有不同:
addEventListener( mdn引用 ):
obj.addEventListener('click', callback, false); function callback(){ /* do stuff */ }
addEventListener
事件列表 。
attachEvent( msdn参考 ):
obj.attachEvent('onclick', callback); function callback(){ /* do stuff */ }
attachEvent
事件列表 。
参数
对于这两种方法,参数如下:
1.是事件types。
2.事件触发后是否调用该函数。
3. (仅限addEventListener
)如果为true,则表示用户希望启动捕获 。
说明
这两种方法都用于实现将事件附加到元素的相同目标。
不同之处在于attachEvent
只能用于较老的三叉戟渲染引擎( IE5 + IE5-8 *),而addEventListener
是在大多数其他浏览器(FF,Webkit,Opera,IE9 +)中实现的W3标准。
正如Smitty所build议的,您应该看看这个Dustin Diaz addEvent,以便在不使用框架的情况下实现一个稳定的跨浏览器实现。
对于固定的跨浏览器事件支持,包括使用Diaz解决scheme无法获得的规范化,请使用框架 。
* IE9-10支持两种方法,用于向后兼容。
感谢Luke Puplett指出attachEvent
已经从IE11中删除。
任何人仍然打这个讨论,没有find他们正在寻找结帐的答案:
http://dustindiaz.com/rock-solid-addevent
这是我为那些限制使用框架而发现的最优雅的解决scheme之一。
function addEvent(obj, type, fn) { if (obj.addEventListener) { obj.addEventListener(type, fn, false); EventCache.add(obj, type, fn); } else if (obj.attachEvent) { obj["e" + type + fn] = fn; obj[type + fn] = function () { obj["e" + type + fn](window.event); } obj.attachEvent("on" + type, obj[type + fn]); EventCache.add(obj, type, fn); } else { obj["on" + type] = obj["e" + type + fn]; } } var EventCache = function () { var listEvents = []; return { listEvents: listEvents, add: function (node, sEventName, fHandler) { listEvents.push(arguments); }, flush: function () { var i, item; for (i = listEvents.length - 1; i >= 0; i = i - 1) { item = listEvents[i]; if (item[0].removeEventListener) { item[0].removeEventListener(item[1], item[2], item[3]); }; if (item[1].substring(0, 2) != "on") { item[1] = "on" + item[1]; }; if (item[0].detachEvent) { item[0].detachEvent(item[1], item[2]); }; item[0][item[1]] = null; }; } }; }(); addEvent(window,'unload',EventCache.flush);