返回顶部

页面中多个window.onload,js只执行最后一个window.onload的解决方法

来源:建枫 发布时间:2016-05-05

前话

相信大家有时候迫不得已会在里面的页面中写了多个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与各个注册函数之间的耦合性,所以不是很推荐用这种方法!

方法二:用事件注册函数,如addEventListener

这种方法的思想主要是利用事件监听函数,由于函数会监听某个事件发生的时候,然后去内部去调用某函数,代码如下:

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树建立之后就立即执行!

后面内容持续更新………………………………