正常来说,一个web页面只会设置一个window.onload。但是如果使用到了页面嵌套(如php的include),则有可能会出现一个web页面出现多个window.onload。这时,我们会发现,只有一个window.onload里的代码被执行了。有以下两种方法可以解决这个问题。
一、使用addEventListener()
这时候我们可以使用HTML DOM的addEventListener()方法来代替window.onload。使用方法如下:
function onload2(){
}
if (window.attachEvent){
//IE8及以下中支持的方法,事件以on开头,如onload
window.attachEvent("onload", onload2);//这里只写方法名,不要跟()
} else if (window.addEventListener) {
//IE9及以上/Mozilla/Firefox的方法,事件不以on开头,如load
window.addEventListener("load", onload2, false);
}
Internet Explorer从5.0开始,提供了attachEvent方法,使用这个方法,可以一个事件,绑定多个处理过程。但是Mozilla/Firefox并不支持这个方法,它使用另外一个方法addEventListener(IE9及以上也开始支持此方法)。它们之间有少许区别,在attachEvent方法中,事件是以"on"开头的,而addEventListener,事件不是以"on"开头,另外,addEventListener还有第三个参数,一般指定false就可以。
因此,在程序中,给一个事件指派多个处理过程的话。需要根据不同的浏览器,选择使用attachEvent和addEventListener。
二、自己实现add方法
或者,也可以自己写add方法:
function addLoadEvent(func) {
var oldonload = window.onload;
if(typeof window.onload != 'function'){
window.onload = func;
}else{
window.onload = function(){
oldonload();
func();
}
}
}
window.onload = function(){
alert("第一个onload");
}
function secondOnload(){
alert("第二个onload");
}
addLoadEvent(secondOnload);
addLoadEvent(function(){
alert("第三个onload");
});
三、addEventListener的其它用处
DOM的addEventListener()可以使用的地方很多。如:
//同一个按钮添加多个onclick事件,且不会覆盖之前的onclick事件
//事件名不要出现"on"
document.getElementById("myBtn").addEventListener("click", myFunction);
document.getElementById("myBtn").addEventListener("click", someOtherFunction);
//为同一个按钮添加多个不同事件
document.getElementById("myBtn").addEventListener("mouseover", myFunction);
document.getElementById("myBtn").addEventListener("click", someOtherFunction);
document.getElementById("myBtn").addEventListener("mouseout", someOtherFunction);
如果需要调用的function有带参数,可以先调用匿名函数,然后在匿名函数中调用带参函数:
document.getElementById("myBtn").addEventListener("click", function() {
myFunction(p1, p2);
});