javascript之DOMReady

DOMReady實現策略
    * 在頁面的DOM樹建立完成後(即HTML解析第一步完成)就觸發,而無需等待其餘資源的加載,即DOMReady實現策略
    * 支持DOMContentLoaded事件的瀏覽器: 就使用DOMContentLoaded事件
    * 不支持DOMContentLoaded事件的瀏覽器: 使用Hack兼容
    * 經過IE中的document.documentElement.doScroll('left')來判斷DOM樹是否建立完畢html

代碼實現瀏覽器

function myReady(fn){

    if(document.addEventListener){
        document.addEventListener('DOMContentLoaded',fn,false);
    }else{//低版本瀏覽器
        IEContentLoaded(fn);
    }

    //IE模擬DOMContentLoaded
    function IEContentLoaded(fn){
        var d = window.document;
        var done = false;
        //值執行一次用戶的回調函數init();
        var init = function(){
            if(!done){
                done = true;
                fn();
            }
        };

        (function(){
            try{
                //DOM樹未建立完以前調用doScroll會拋出錯誤
                d.documentElement.doScroll('left');
            }catch(e){
                //延遲在試一次,
                //var func = function() { alert(func === arguments.callee);}func();
              //執行上述代碼,能夠看到alter出來的結果是true,注意,此處用的是「===」,就是說func與arguments.callee對象類型和值都相等。
                setTimeout(arguments.callee,50);
                return;
            }
            init();
        })();

        //監聽document的加載狀態
        d.onreadystatechange = function(){
            //若是用戶是在domReady以後綁定的函數,就立馬執行
            if(d.readyState == 'complete'){
                d.onreadystatechange = null;
                init();
            }
        }
    }
}

 

爲何使用domReady來代替onload?dom

    * onload是須要等待頁面全部資源都加載完畢,才觸發函數

    * domReady是DOM加載完就觸發
spa

    咱們下面看個例子code

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8">
        <title>domReady</title>
        <script src="domReady.js"></script>
    </head>
    <body>
        <div id="showMsg"></div>
        <div>
            <img src="images/1.jpg"/>
            <img src="images/2.jpg"/>
            <img src="images/3.jpg"/>
        </div>
        <script>
            var d = document;
            var msgBox = d.getElementById('showMsg');
            var imgs = d.getElementsByTagName('img');
            var time1 = null,time2 = null;
            myReady(function(){
                msgBox.innerHTML += "dom已加載!<br>";
                time1 = new Date().getTime();
                msgBox.innerHTML += "時間戳:" + time1 + "<br>";
            });
            window.onload = function(){
                msgBox.innerHTML += "onload已加載!<br>";
                time2 = new Date().getTime();
                msgBox.innerHTML += "時間戳:" + time2 + "<br>";
                msgBox.innerHTML += "domReady比onload快" + (time2 - time1) + "ms<br>";
            };
        </script>
    </body>
</html>

     

相關文章
相關標籤/搜索