您正在寻找的花哨的跨浏览器解决方案......不存在......(想象一大群人说“啊啊啊......”的声音)。
DomContentLoaded是您最好的选择。您仍然需要polling
IE-oldies 的技术。
- 尝试使用 addEventListener;
- 如果不可用(显然是 IE),请检查框架;
- 如果不是帧,则滚动直到没有抛出错误(轮询);
- 如果是frame,使用IE事件document.onreadystatechange;
- 对于其他不支持的浏览器,请使用旧的 document.onload 事件。
我在javascript.info上找到了以下代码示例,您可以使用它来覆盖所有浏览器:
function bindReady(handler){
var called = false
function ready() {
if (called) return
called = true
handler()
}
if ( document.addEventListener ) { // native event
document.addEventListener( "DOMContentLoaded", ready, false )
} else if ( document.attachEvent ) { // IE
try {
var isFrame = window.frameElement != null
} catch(e) {}
// IE, the document is not inside a frame
if ( document.documentElement.doScroll && !isFrame ) {
function tryScroll(){
if (called) return
try {
document.documentElement.doScroll("left")
ready()
} catch(e) {
setTimeout(tryScroll, 10)
}
}
tryScroll()
}
// IE, the document is inside a frame
document.attachEvent("onreadystatechange", function(){
if ( document.readyState === "complete" ) {
ready()
}
})
}
// Old browsers
if (window.addEventListener)
window.addEventListener('load', ready, false)
else if (window.attachEvent)
window.attachEvent('onload', ready)
else {
var fn = window.onload // very old browser, copy old onload
window.onload = function() { // replace by new onload and call the old one
fn && fn()
ready()
}
}
}