功能检测支持DOMContentLoaded事件

时间:2013-08-07 03:49:48

标签: javascript events javascript-events browser-feature-detection domcontentloaded

是否可以检测对DOMContentLoaded事件的支持?

方法就像Kangax的解决方案一样无效,因为DOMContentLoaded不会作为任何元素的属性公开:Detecting event support without browser sniffing

3 个答案:

答案 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准备好之前出错。