本文介绍在IE浏览器中检测DOM加载完成的技巧。由于IE不支持DOMContentLoaded事件,可利用d.documentElement.doScroll('left')在DOM未加载时抛出异常的特性,通过轮询检测无异常时触发回调函数,实现快速执行DOM操作。
IE浏览器DOM Ready检测需求
若仅需操作DOM元素,无需等待页面所有资源加载完毕,追求更快的执行速度。
Firefox等浏览器提供DOMContentLoaded事件以解决此问题,但IE浏览器缺乏该支持。
利用doScroll异常检测机制
MSDN关于JSCRIPT的文档提及,页面DOM未加载完成时调用doScroll方法会引发异常。反向利用此特性:若调用不抛出异常,则表明DOM已加载完毕。
核心代码实现与原理
具体实现代码如下:
function IEContentLoaded (w, fn) {
var d = w.document, done = false,
// 仅执行一次
init = function () {
if (!done) {
done = true;
fn();
}
};
// 轮询检测无错误
(function () {
try {
// 在ondocumentready之前会抛出错误
d.documentElement.doScroll('left');
} catch (e) {
setTimeout(arguments.callee, 50);
return;
}
// 无错误,触发回调
init();
})();
// 力求在onload之前触发
d.onreadystatechange = function() {
if (d.readyState == 'complete') {
d.onreadystatechange = null;
init();
}
};
}应用背景与使用示例
此函数由Diego Perini于07年发布该方法,
获得广泛认可,诸多开源框架如JQuery的ready机制均借鉴此方法。
若后续需在IE中实现DomReady,可采用此方案。
使用示例:
IEContentLoaded( document.getElementById("test") , test );
function test(){ }