是否可以检测对DOMContentLoaded
事件的支持?
方法就像Kangax的解决方案一样无效,因为DOMContentLoaded
不会作为任何元素的属性公开:Detecting event support without browser sniffing
答案 0 :(得分:3)
只听所有三个事件,第一个触发胜利。如果获胜者是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>
答案 1 :(得分:1)
实际&amp;事实上,不需要 DOMContentLoaded Event 。 由于html流加载的原理,如果文档HTML被完全解析,则可以使用任何脚本来确定。
您所要做的就是在文档的结束标记之前放置函数(否则将分配给DOMContentLoaded事件)。
它将在最后一个HTML元素被解析为DOM之后执行,它将比内置的DOMContentLoaded更快更早地执行。
答案 2 :(得分:0)
我发现mozilla开发者网站上有关usage of the DOMContentLoaded event的以下说明非常有用。最后,它讨论了向后兼容的方法来实现同样的事情,我已经在这里提取了(毫不奇怪它专注于IE)......
Internet Explorer 8支持readystatechange事件,可以是 用于检测DOM何时就绪。在早期版本的Internet中 资源管理器,可以通过反复尝试执行来检测此状态 document.documentElement.doScroll(&#34; left&#34;);,因为这个片段会抛出 在DOM准备好之前出错。