Firefox、Opera和基于Webkit的浏览器具有文档级别事件 DOMContentLoaded
,您可以使用 document.addEventListener("DOMContentLoaded", fn, false)
监听该事件。
在IE中则更加复杂。jQuery在IE中所做的是监视文档对象上的 onreadystatechange
以获取特定的就绪状态,并备用 document.onload 事件。document.onload 事件比DOM就绪事件发生得更晚(仅当所有图像都加载完成时),因此只在较早的事件由于某种原因无法工作时才用作后备。
如果花一些时间搜索,您会发现有代码可以实现此功能。我认为最经过验证的代码位于大型框架如jQuery和YUI中,因此,即使我不使用该框架,我也会查看它们的源代码以了解技术。
下面是 jQuery 1.6.2 中 document.ready()
主要部分的源代码:
bindReady: function() {
if ( readyList ) {
return;
}
readyList = jQuery._Deferred();
if ( document.readyState === "complete" ) {
return setTimeout( jQuery.ready, 1 );
}
if ( document.addEventListener ) {
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
window.addEventListener( "load", jQuery.ready, false );
} else if ( document.attachEvent ) {
document.attachEvent( "onreadystatechange", DOMContentLoaded );
window.attachEvent( "onload", jQuery.ready );
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
},
document.readyState
属性可以使用,但我不确定它在所有浏览器中的兼容性…… - Digital Plane