dom加载完的判断

dom加载完的判断

 

 

window.onload事件可以安全的执行javascript,因为该事件是在页面完全加载完后才开始执行(包括页面内的图片、flash等所有元素),不会因为JS需要对某个DOM 操作,而页面还没有加载该节点而引起错误。但是这种安全是需要付出代价的:如果某些图片(或者一些别的东西)加载特别慢,那么load事件会等到很久之后才会触发。针对这个问题,一些JS框架提供了一些补充方法。如:jquery的$(document).ready()、mootools的domready事件。都是在页面的DOM加载完毕后立即执行,而不需要等待漫长的图片下载过程。如果不使用这些框架,可以使用这个独立的DomReady.js

 

小巧独立的Javascript库:DomReady.js

 

Js代码  

(function(){  

 

    var DomReady = window.DomReady = {};  

 

    // Everything that has to do with properly supporting our document ready event. Brought over from the most awesome jQuery.   

 

    var userAgent = navigator.userAgent.toLowerCase();  

 

    // Figure out what browser is being used  

    var browser = {  

        version: (userAgent.match( /.+(?:rv|it|ra|ie)[//: ]([/d.]+)/ ) || [])[1],  

        safari: /webkit/.test(userAgent),  

        opera: /opera/.test(userAgent),  

        msie: (/msie/.test(userAgent)) && (!/opera/.test( userAgent )),  

        mozilla: (/mozilla/.test(userAgent)) && (!/(compatible|webkit)/.test(userAgent))  

    };      

 

    var readyBound = false;   

    var isReady = false;  

    var readyList = [];  

 

    // Handle when the DOM is ready  

    function domReady() {  

        // Make sure that the DOM is not already loaded  

        if(!isReady) {  

            // Remember that the DOM is ready  

            isReady = true;  

 

            if(readyList) {  

                for(var fn = 0; fn < readyList.length; fn++) {  

                    readyList[fn].call(window, []);  

                }  

 

                readyList = [];  

            }  

        }  

    };  

 

    // From Simon Willison. A safe way to fire onload w/o screwing up everyone else.  

    function addLoadEvent(func) {  

      var oldonload = window.onload;  

      if (typeof window.onload != 'function') {  

        window.onload = func;  

      } else {  

        window.onload = function() {  

          if (oldonload) {  

            oldonload();  

          }  

          func();  

        }  

      }  

    };  

 

    // does the heavy work of working through the browsers idiosyncracies (let's call them that) to hook onload.  

    function bindReady() {  

        if(readyBound) {  

            return;  

        }  

 

        readyBound = true;  

 

        // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event  

        if (document.addEventListener && !browser.opera) {  

            // Use the handy event callback  

            document.addEventListener("DOMContentLoaded", domReady, false);  

        }  

 

        // If IE is used and is not in a frame  

        // Continually check to see if the document is ready  

        if (browser.msie && window == top) (function(){  

            if (isReady) return;  

            try {  

                // If IE is used, use the trick by Diego Perini  

                // http://javascript.nwbox.com/IEContentLoaded/  

                document.documentElement.doScroll("left");  

            } catch(error) {  

                setTimeout(arguments.callee, 0);  

                return;  

            }  

            // and execute any waiting functions  

            domReady();  

        })();  

 

        if(browser.opera) {  

            document.addEventListener( "DOMContentLoaded", function () {  

                if (isReady) return;  

                for (var i = 0; i < document.styleSheets.length; i++)  

                    if (document.styleSheets[i].disabled) {  

                        setTimeout( arguments.callee, 0 );  

                        return;  

                    }  

                // and execute any waiting functions  

                domReady();  

            }, false);  

        }  

 

        if(browser.safari) {  

            var numStyles;  

            (function(){  

                if (isReady) return;  

                if (document.readyState != "loaded" && document.readyState != "complete") {  

                    setTimeout( arguments.callee, 0 );  

                    return;  

                }  

                if (numStyles === undefined) {  

                    var links = document.getElementsByTagName("link");  

                    for (var i=0; i < links.length; i++) {  

                        if(links[i].getAttribute('rel') == 'stylesheet') {  

                            numStyles++;  

                        }  

                    }  

                    var styles = document.getElementsByTagName("style");  

                    numStyles += styles.length;  

                }  

                if (document.styleSheets.length != numStyles) {  

                    setTimeout( arguments.callee, 0 );  

                    return;  

                }  

 

                // and execute any waiting functions  

                domReady();  

            })();  

        }  

 

        // A fallback to window.onload, that will always work  

        addLoadEvent(domReady);  

    };  

 

    // This is the public function that people can use to hook up ready.  

    DomReady.ready = function(fn, args) {  

        // Attach the listeners  

        bindReady();  

 

        // If the DOM is already ready  

        if (isReady) {  

            // Execute the function immediately  

            fn.call(window, []);  

        } else {  

            // Add the function to the wait list  

            readyList.push( function() { return fn.call(window, []); } );  

        }  

    };  

 

    bindReady();  

 

})();  

 

使用方法:

Html代码  

<html lang="en">   

<head>   

    <script src="domready.js" type="application/javascript"></script>   

    <script type="application/javascript">   

        DomReady.ready(function() {   

            alert('dom is ready');   

        });   

    </script>   

</head>   

<body>   

</body>   

</html>   

 

 

 

     jquery里有专门解决DOM加载的函数$(document).ready()(简写就是$(fn)),非常好用!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值