模拟DOMContentLoaded事件

window.onload事件

文档中所有图片,脚本,链接以及子框完成加载后,才会触发window.onload事件。

浏览器兼容性:All

DOMContentLoaded事件

当页面中的文档树解析完成时,Document会触发DOMContentLoaded事件。此时,页面引用的样式表和图像文件,以及包含的框架页面可能还没有加载完成。

浏览器兼容性:Chrome 0.2+ , Firefox 1.0+, IE9+, Opera 9.0+, Safari 3.1+

模拟DOMContentLoaded

用户可等不及,文档全部加载完才可以与页面交互,这样的交互体验也是极差的,那对于不支持DOMContentLoaded的浏览器,我们只能来模拟了!

第一种方案:

 1 /*
 2 document.readyState 四种状态
 3 
 4 uninitialized: 尚未开始加载
 5 loading: 正在加载
 6 interactive: 已加载了必需内容
 7 complete: 文档加载完成
 8 */
 9 function DomContentLoaded(){
10     if(document.readyState === 'complete'){
11         document.detachEvent("onreadystatechange", DOMContentLoaded);
12         //DOMContentLoaded触发,执行绑定的事件
13     }
14 };
15 
16 document.attatchEvent("onreadystatechange", DOMContentLoaded);

 

第二种方案:

 1 /*
 2 当前页面如果是顶层窗口,可以每隔1ms模拟点击滚动条,直到不再抛出异常
 3 判断页面是否包含在firame中的方法:
 4 if(window.self === window.top){
 5     //当前页面是父页面
 6 }
 7 下面是jQuery的判断方法,又学会了一招(●'◡'●)
 8 */
 9 var toplevel = false;
10 try{
11     //判断当前页面是否包含在iframe中
12     topleve = window.iframeElement == null;
13 }catch(e){}
14 
15 function doScrollCheck(){
16     try{
17         document.documentElement.doScroll('left');
18     }catch(e){
19         setTimeout(doScrollCheck, 1);
20     }
21 }
22 if(document.documentElement.doScroll && toplevel){
23     doScrollCheck();
24 }

 

当页面内容较多或包含iframe时,模拟滚动条点击会比onreadystatechange先触发,因此jQuery 1.7.1中,结合了这两种方法来模拟DOMContentLoaded事件。

posted @ 2014-08-11 21:53  周文洪  阅读(336)  评论(0编辑  收藏  举报