相信大家有时候迫不得已会在里面的页面中写了多个window.onload注册函数,或者在加载别人的插件的时候,自己的js文件里面已经用到了window.onload,别人的插件也会用到window.onload,这样就会造成,一个页面中会有多个window.onload注册函数,按照浏览器默认的解析机制,那么只会执行一个window.onload函数,即排在最后的一个window.onload注册函数!那么这篇文章介绍一下怎么处理这种问题,我们的需求是页面的无论有多少个window.onload注册函数都需要它执行!以下是我想到的几个方法:
这种方法的思想是保证在脚本的尾部定义有一个window.onload注册函数,这个注册函数里面把前面的注册函数分别调用如下,代码如下:
function fun1(){//……};
function fun2(){//……};
window.onload = function(){
fun1();
fun2();
};
测试示意图吐下:(左边代码,右边控制台测试结果)
特点:首先这种方法很不灵活,因为你要去维护一个window.onload注册函数,比如你将来又添加了一个fun3,那么你得回去改window.onload方法。这种方法加大了window.onload与各个注册函数之间的耦合性,所以不是很推荐用这种方法!
这种方法的思想主要是利用事件监听函数,由于函数会监听某个事件发生的时候,然后去内部去调用某函数,代码如下:
function fun1(){//……};
function fun2(){//……};
function addEvent(dom,type,handler){
return dom.addEventListener?dom.addEventListener(type,handler,false):dom.attachEvent("on"+type,handler);
};
addEvent(window,"load",fun1);
addEvent(window,"load",fun2);
测试示意图如下:(上面代码,下边控制台测试结果)
特点:兼容性较好,耦合性较低,经测试,在ie8或者更老的浏览器版本中,无法保证各分注册函数执行的顺序按序执行!其它方面大问题未发现!比较推荐这种方法!
这个方法跟方法二是大同小异的,其思想是建立一个注册函数,用来向window.onload方法中添加新增加的注册函数!代码如下:
function fun1(){//……};
function fun2(){//……};
function addLoadFun(fn){
var tempFun = window.onload;
if(typeof tempFun === "function"){
window.onload = function(){
tempFun();
fn();
}else{
window.onload = fn;
};
};
};
addLoadFun(fun1);
addLoadFun(fun2);
测试结果如下:(左边为代码,右边为控制台测试输出结果)
特点:经测试,兼容各大浏览器,能保证代码按先后顺序执行,同时代码耦合性较低,比较推荐这种方法!
尽量少用window.onload向页面添加处理函数,因为这个方法要求必须所有资源都要下载完成了才会执行,这会导致我们的页面有时候会出现一定的延迟,甚至会出现打不开页面等情况,比较好的做法是用DOMContentLoaded事件,或者使用使用jquery库,这些方法都会在页面dom树建立之后就立即执行!