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