我不知道如何使用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.如何相应地修改正确/首选方法?
两者的用法类似,但两者对于event参数的语法略有不同:
obj.addEventListener('click', callback, false); function callback(){ /* do stuff */ }
事件列表的addEventListener
.
obj.attachEvent('onclick', callback); function callback(){ /* do stuff */ }
事件列表的attachEvent
.
对于这两种方法,参数如下:
1.是事件类型.
2.触发事件后是否调用函数.
3. (addEventListener
仅)如果为true,表示用户希望启动捕获.
这两种方法都用于实现将事件附加到元素的相同目标.
不同之处在于attachEvent
它只能用于较旧的三叉戟渲染引擎(IE5 + IE5-8*),并且addEventListener
是在大多数其他浏览器(FF,Webkit,Opera,IE9 +)中实现的W3标准.
对于可靠的跨浏览器事件支持,包括使用Diaz解决方案无法获得的规范化,请使用框架.
*IE9-10支持这两种方法,以实现向后兼容性.
感谢Luke Puplett指出attachEvent
已从IE11中删除.
正如Smitty所建议的那样,你应该看看这个Dustin Diaz addEvent,以便在不使用框架的情况下实现可靠的跨浏览器实现:
function addEvent(obj, type, fn) {
if (obj.addEventListener) {
obj.addEventListener(type, fn, false);
}
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]);
}
else {
obj["on"+type] = obj["e"+type+fn];
}
}
addEvent( document, 'click', function (e) {
console.log( 'document click' )
})
任何人仍然在进行讨论而没有找到他们正在寻找结账的答案:
http://dustindiaz.com/rock-solid-addevent
这是我发现我们这些限制使用框架的最优雅的解决方案之一.
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);