是否可以检测到对DOMContentLoaded
事件的支持?
方法类似于Kangax的解决方案,因为DOMContentLoaded
没有作为任何元素的属性公开:在没有浏览器嗅探的情况下检测事件支持
只需监听所有三个事件,第一个事件就会触发胜利。如果获胜者是DOMContentLoaded,则支持它。如果在其他两个中的一个被触发时它还没有被触发,那么它就不受支持。
<script>
var hasDOMContentLoaded = false,
ready = false,
readyMethod = null;
// Listen for "DOMContentLoaded"
document.addEventListener("DOMContentLoaded", function(event) {
hasDOMContentLoaded = true;
init("DOMContentLoaded");
});
// Listen for "onreadystatechange"
document.onreadystatechange = function () { init("onreadystatechange"); }
// Listen for "load"
document.addEventListener("load", function(event) { init("load"); });
// Gets called after any one of the above is triggered.
function init(method) {
if(!ready) {
ready = true;
readyMethod = method;
go();
}
}
// Page is ready, time is up.
// Eitehr DOMContentLoaded has been triggered or it never will.
function go() {
console.log("hasDOMContentLoaded: ", hasDOMContentLoaded);
// My initialization code here
}
</script>
实际上&实际上,不需要DOMContentLoaded事件。由于HTML流加载的原理,任何脚本都可以用来确定文档HTML是否被完全解析。
您所要做的就是将函数(否则会分配给DOMContentLoaded事件)放在文档的结束标记之前。
它将在最后一个HTML元素被解析为DOM之后执行,并且它将比内置的DOMContentLoaded执行得更快、更早。
我发现以下关于mozilla开发人员站点中DOMContentLoaded事件用法的解释非常有用。最后,它谈到了实现相同目标的向后兼容方法,我在这里提取了这些方法(毫不奇怪,它专注于IE)。。。
Internet Explorer 8支持readystatechange事件,该事件可以用于检测DOM何时就绪。在早期版本的Internet中Explorer,可以通过重复尝试执行来检测此状态document.dococumentElement.doScroll("left");,因为这个片段会抛出一个错误,直到DOM准备好。