20

我继承了这段代码,它似乎不是最佳的并且可能不正确,因为它在窗口和文档对象上都添加了事件侦听器。但是,除了黑莓 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);
4

3 回答 3

62

如果您想知道它是如何完成的或看到一种方法。我推荐看看 Diego Perini 的作品。他的工作和方法被用于许多 DOM 库,包括 jQuery。不幸的是,这家伙似乎没有得到太多的信任。他是 try/catch 轮询方法的先驱者,当 IE 混入其中时,这使得跨浏览器 dom 加载事件成为可能。

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

于 2011-08-01T17:58:43.270 回答
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() {
  // ... 
})
于 2011-08-01T18:01:46.323 回答
3

我个人会为此使用jQuery 。

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

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

$(callback);
于 2011-08-01T17:48:35.817 回答