使用DOMContentLoaded取代部分window.onload

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

使用DOMContentLoaded的好处是不言而喻的,其可以在DOM加载解析完毕后立即执行,而不是像window.onload那样还要继续等待所有外部图片什么的都加载完成才执行,所以在这点上DOMContentLoaded的效率功能要大于window.onload,一般适合于绑定事件到指定元素上时使用。

1
2
3
4
5
6
if(document.addEventListener){
  document.addEventListener("DOMContentLoaded",
    function() {
        alert('DOMContentLoaded is execute')
    }, false);
}

大家看到这段代码肯定非常熟悉,是的,想必大家都用过下面这段辅助函数,主要用于给元素绑定事件的,注意是绑定事件,多个绑定事件将依次触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function addListener(element, e, fn) {
    if (element.addEventListener) {
        element.addEventListener(e, fn, false);
    } else {
        element.attachEvent("on" + e, fn);
    }
}
 
// 比如绑定window.onload事件
addListener(window, "load", 
    function() {
        alert('window.onload is execute');
    }
);

说到这里大家就有疑问了,IE系列的浏览器不支持.addEventListener方法,这也就是在addListener函数里面要做个判断的原因,如果不支持就使用.attachEvent方法,那回到一开始的DOMContentLoaded的代码,那么这段代码很明显就不能支持IE系列浏览器了,我们能不能使用addListener函数呢?很遗憾,问题不在于这儿,而是IE系列浏览器不能很好的支持DOMContentLoaded,所以即使使用了addListener这样的辅助函数依然无济于事。

注意 : 微软最新发布的Internet Explorer 9(IE9)已经能够支持.addEventListener和DOMContentLoaded。

真的没有办法了吗?其实办法也不是没有,网上就有人总结出了两种方法:

  1. 一种是创建空script标签,属性拥有defer,然后待onreadystatechange为complete时激发DOMContentLoaded。
  2. 一种是通过调用doScroll(‘left’)的原理去判断DOMContentLoaded。

如果大家对代码实现比较感兴趣的话可以参考《IE里模拟DOMContentLoaded事件》这篇文章。

说到这里,大家也许在想有没有更好的封装函数供我们使用呢?幸运的是Jesse Skinner已经在文章《addDOMLoadEvent》给出了其设计的函数脚本adddomloadevent.js,大家可以参考下。

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!

请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*