• JavaScript DOM-Ready 机制


    IE9开始和其他现代浏览器可以通过绑定DOMContentLoaded事件;
    IE9之前的的浏览器需要绑定onreadystatechange事件并等待readyState为"complete"来判断;
    此外IE9之前的浏览器还可以通过不停地执行document.documentElement.doScroll("left")直到不抛出异常来判断。

    IE还可以通过<script>脚本设置属性defer="defer",并判断该脚本的onreadystatechange事件来触发DOM-Ready。

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      5 <style rel="stylesheet" type="text/css">
      6 </style>
      7 <script type="text/javascript">
      8 setTimeout(function(){
      9     
     10     // 事件队列.
     11     var readyFns;
     12     // 标记状态.fireReady触发时设置为true.
     13     var isReady=false;
     14 
     15     // 添加监听事件或马上执行.
     16     window.ready=function(fn){
     17         initReady();
     18         if(isReady){
     19             fn();
     20         }
     21         else{
     22             readyFns.push(fn);
     23         }
     24     };
     25     // 触发DOM-Ready事件.
     26     function fireReady(){
     27         // 只执行一次.
     28         if(isReady){
     29             return;
     30         }
     31         isReady=true;
     32         // 遍历执行.
     33         if(readyFns){
     34             for(var i=0,fn;fn=readyFns[i++];){
     35                 fn();
     36             }
     37             // 清空事件.
     38             readyFns.length=0;
     39         }
     40     }
     41     // IE678下判断DOM是否加载完毕.
     42     function doscrollcheck(){
     43         try{
     44             document.documentElement.doScroll("left");
     45             document.title+="doscroll";
     46             fireReady();
     47         }
     48         catch(e){
     49             setTimeout(doscrollcheck,1);
     50         }
     51     }
     52     // 初始化监听.
     53     function initReady(){
     54         if(readyFns){
     55             return;
     56         }
     57         readyFns=[];
     58         // 添加事件绑定.
     59         if(document.addEventListener){
     60             document.title+="W3C";
     61             document.addEventListener("DOMContentLoaded",function(){
     62                 document.removeEventListener("DOMContentLoaded",arguments.callee,false);
     63                 fireReady();
     64             },false);
     65         }
     66         else if(document.attachEvent){
     67             document.title+="IE678";
     68             document.attachEvent("onreadystatechange",function(){
     69                 if(document.readyState==="complete"){
     70                     document.detachEvent("onreadystatechange",arguments.callee);
     71                     fireReady();
     72                 }
     73             });
     74             document.attachEvent("onload",function(){
     75                 document.title="onload";
     76                 fireReady()
     77             });
     78             // 顶层窗口还可以检测doScrollCheck方法来检测是否可以触发ready事件
     79             if(document.documentElement.doScroll){
     80                 // 是否为顶层窗口.
     81                 if(self===self.top){
     82                     doscrollcheck();
     83                 }
     84             }
     85         }
     86     }
     87     // 如果是动态加载上面的脚本.则应该判断是否完成.
     88     (function(){
     89         if(document.readyState==="complete"){
     90             document.body.innerHTML+="document.readyState loaded";
     91             fireReady();
     92         }
     93     })();
     94 
     95     // 测试.
     96     ready(function(){
     97     document.body.innerHTML+="1";
     98     });
     99     ready(function(){
    100         document.body.innerHTML+="2";
    101     });
    102     ready(function(){
    103         document.body.innerHTML+="3";
    104     });
    105 },0);// 调整延迟来模拟"动态加载该DOM-Ready的情况"
    106 
    107 
    108 setTimeout(function(){
    109     ready(function(){
    110         document.body.innerHTML+="4";
    111     });
    112 },1000);
    113 window.onload=function(){
    114     document.body.innerHTML+="loaded";
    115 };
    116 
    117 </script>
    118 </head>
    119 <body><img src="http://1.su.bdimg.com/skin_zoom/38.jpg" style="10px;height:10px;" /></body>
    120 </html>

    参考司徒正美的一篇博客:javascript的domReady

  • 相关阅读:
    洛谷 P1080 [NOIP2012 提高组] 国王游戏
    洛谷 P4370 [Code+#4]组合数问题2
    洛谷 P4369 [Code+#4]组合数问题
    洛谷 P3311 [SDOI2014] 数数
    implicit关键字详解
    模式匹配
    option[T]、Any、Nothing、Null类型的介绍
    高阶函数
    函数的介绍
    集合
  • 原文地址:https://www.cnblogs.com/xf_z1988/p/javascript_dom_ready.html
Copyright © 2020-2023  润新知