跨浏览器Dom Ready

时间:2011-08-01 17:46:27

标签: javascript javascript-events onload-event

我继承了这段代码,它似乎不是最理想的,可能不正确,因为它在窗口和文档对象上都添加了事件监听器。但是,除黑莓5.0外,它正常工作。有人可以解释是否所有这些都设置正确,或者是否有任何建议可以使其更好和/或更精简?

        if (document.readyState === "complete") 
            callback();
        else if (document.addEventListener) 
        {
            document.addEventListener("DOMContentLoaded",callback,false);
            window.addEventListener("load",callback,false);
        }
        else if(window.attachEvent) 
        {
            document.attachEvent("onreadystatechange", callback);
            window.attachEvent("onLoad",callback);
        } else
            setTimeout(callback,2000);

3 个答案:

答案 0 :(得分:62)

如果你想知道它是如何完成的,或者想要一种方法。我建议看看Diego Perini的作品。他的工作和方法被用在许多DOM库中,包括jQuery。不幸的是,这家伙似乎没有得到太多的信任。他是开创了try / catch轮询方法的人,这使得在IE混合使用时跨浏览器dom加载事件成为可能。

https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js

答案 1 :(得分:5)

如果你想使用纯JavaScript,你可以使用以下跨浏览器功能(来源(俄语):http://javascript.ru/unsorted/top-10-functions

function bindReady(handler){
    var called = false     
    function ready() {
        if (called) return
        called = true
        handler()
    }     
    if ( document.addEventListener ) {
        document.addEventListener( "DOMContentLoaded", function(){
            ready()
        }, false )
    } else if ( document.attachEvent ) { 
        if ( document.documentElement.doScroll && window == window.top ) {
            function tryScroll(){
                if (called) return
                if (!document.body) return
                try {
                    document.documentElement.doScroll("left")
                    ready()
                } catch(e) {
                    setTimeout(tryScroll, 0)
                }
            }
            tryScroll()
        }
        document.attachEvent("onreadystatechange", function(){     
            if ( document.readyState === "complete" ) {
                ready()
            }
        })
    }
    if (window.addEventListener)
        window.addEventListener('load', ready, false)
    else if (window.attachEvent)
        window.attachEvent('onload', ready)
    /*  else  // use this 'else' statement for very old browsers :)
        window.onload=ready
    */
}
readyList = []      
function onReady(handler) {  
    if (!readyList.length) { 
        bindReady(function() { 
            for(var i=0; i<readyList.length; i++) { 
                readyList[i]() 
            } 
        }) 
    }   
    readyList.push(handler) 
}

用法:

onReady(function() {
  // ... 
})

答案 2 :(得分:3)

就我个人而言,我会使用jQuery

jQuery旨在处理文档就绪状态的各种不同浏览器实现。

使用jQuery,您的上述代码如下所示:

$(callback);