跨浏览器Dom Ready

Vin*_*nyD 20 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);
Run Code Online (Sandbox Code Playgroud)

chj*_*hjj 62

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

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

  • +1因为这是他的工作被jQuery使用,他值得一些信任. (11认同)

VIK*_*VIK 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) 
}
Run Code Online (Sandbox Code Playgroud)

用法:

onReady(function() {
  // ... 
})
Run Code Online (Sandbox Code Playgroud)