首页 > JavaScript脚本, 前端开发 > 即拷即用:onDOMReady(提取自jQuery.ready)

发表评论 阅读评论 即拷即用:onDOMReady(提取自jQuery.ready)

2010年4月9日

上次abeet兄弟分享了即拷即用系列的动画函数 这次的onDOMReady更有吸引力了

先说明一下,为什么要提取jQuery的ready方法?

因为在很多时候大家做前端时,需要在DOM树载入时马上执行一些函数,比如对导航条进行初始化。
但又不愿意仅为了这一个需求而引入整个jQuery库,于是就把jQuery的ready方法提取出来,单独使用了。

另外你也可以在构建自己的js框架时使用此函数。

重复一遍,我们的口号是什么?
彪悍的应用,没有一行代码是多余的!!!

(function(){
        var isReady=false; //判断onDOMReady方法是否已经被执行过
        var readyList= [];//把需要执行的方法先暂存在这个数组里
        var timer;//定时器句柄
        ready=function(fn) {
                if (isReady )
                        fn.call( document);
                else
                        readyList.push( function() { return fn.call(this);});
                return this;
        }
        var onDOMReady=function(){
                for(var i=0;i<readyList.length;i++){
                        readyList[i].apply(document);
                }
                readyList = null;
        }
        var bindReady = function(evt){
                if(isReady) return;
                isReady=true;
                onDOMReady.call(window);
                if(document.removeEventListener){
                        document.removeEventListener("DOMContentLoaded", bindReady, false);
                }else if(document.attachEvent){
                        document.detachEvent("onreadystatechange", bindReady);
                        if(window == window.top){
                                clearInterval(timer);
                                timer = null;
                        }
                }
        };
        if(document.addEventListener){
                document.addEventListener("DOMContentLoaded", bindReady, false);
        }else if(document.attachEvent){
                document.attachEvent("onreadystatechange", function(){
                        if((/loaded|complete/).test(document.readyState))
                                bindReady();
                });
                if(window == window.top){
                        timer = setInterval(function(){
                                try{
                                        isReady||document.documentElement.doScroll('left');//在IE下用能否执行doScroll判断dom是否加载完毕
                                }catch(e){
                                        return;
                                }
                                bindReady();
                        },5);
                }
        }
})();

使用方式如下

ready(navInit);//navInit为已存在的函数
//或
ready(function(){
        if(agt.toLowerCase().indexOf("msie 6") != -1)
                navInitForIE6();//如果浏览器是IE6,则执行navInitForIE6函数来初始化下拉菜单
});

再次感谢abeet的分享

  1. 2010年4月22日21:15 | #1

    这个真是你写的吗?????

    听说1.42的效率很高的呀,能不能再提取一下。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.

您也可以使用微博账号登陆