Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox DOMContentLoaded事件问题_Javascript_Events_Dom - Fatal编程技术网

Javascript Firefox DOMContentLoaded事件问题

Javascript Firefox DOMContentLoaded事件问题,javascript,events,dom,Javascript,Events,Dom,我已经创建了一个与Dom一起工作的脚本,因此它必须等到Dom准备就绪后才能执行每个操作。我希望此脚本可以通过两种方式包含: 在head标记中,以便在Dom准备就绪之前加载它。我已经为此使用了document.addEventListener(“DOMContentLoaded”,function(){…},false),效果很好 当Dom已经加载时,以动态方式加载。在这种情况下,脚本无法工作,因为由于某些原因,如果Dom已加载,则不会触发DOMContentLoaded事件 所以我想知道,有

我已经创建了一个与Dom一起工作的脚本,因此它必须等到Dom准备就绪后才能执行每个操作。我希望此脚本可以通过两种方式包含:

  • 在head标记中,以便在Dom准备就绪之前加载它。我已经为此使用了
    document.addEventListener(“DOMContentLoaded”,function(){…},false)
    ,效果很好
  • 当Dom已经加载时,以动态方式加载。在这种情况下,脚本无法工作,因为由于某些原因,如果Dom已加载,则不会触发DOMContentLoaded事件
所以我想知道,有没有一种方法可以检查Dom是否已经加载,这样脚本就可以在不使用DOMContentLoaded事件的情况下执行代码


PS:这必须是一个外部脚本,因此我无法控制将包含它的页面

最简单的方法之一是检查是否可以在页面末尾获取ElementById。比如:

if (document.getElementById('footer')) { /* Dom is probably loaded */ }
else { /* Dom is probably NOT loaded */ }
但实际上,最佳实践可能是确保代码总是以相同的方式调用。您可以改为使用“onload”事件,因为这将在所有浏览器中工作,并且通常仅在DOMContentLoaded事件之后的几分之一秒。但是,我想这真的取决于您。

定义您的函数:
函数domReadyHandler(){/*…*/}

添加事件侦听器:
document.addEventListener('DOMContentLoaded',domReadyHandler,false)

在动态加载内容后也执行处理程序:
函数myXhrCallback(){/*…*/;domReadyHandler();}

您可以设置一个全局变量,表示脚本正在动态包含,根据这一点,您可以在评估脚本时启动加载侦听器

window.SCRIPT_IS_DYNAMICALLY_LOADED = true;
< include script>

好的,这很俗气,但应该可以: 将外部脚本包装到init()方法中:

e、 (我只是在这里猜测)

然后将脚本导入放回head标记中,并在DOM标记的最底部添加一个脚本标记

<script>
    myModule.init();
</script>

myModule.init();

同样地,我通常不建议这样做,但如果需要避免检查DOM加载的事件,我会这样做

检查document.readyState的值。如果值为“complete”,则可以执行脚本,如果是其他内容,添加侦听器。

我已经考虑过这个方法,但我不知道页面中有哪些元素,因此我无法检查元素的存在,同样的原因,我不能使用onload事件。这意味着我必须更改整个网站系统,但我只想使用脚本。我想你正在使用一个包装器XHR。如果是这样的话,也许你可以在XHR响应完成时手动触发“DOMContentLoaded”?不,我不使用任何XHR包装器,而且这个脚本不能依赖于任何库,这必须是一个外部脚本,所以我无法控制网站的HTML代码。这必须是一个外部脚本,所以我无法控制将包含它的页面
var myModule = {

    init: function {
        //all the code goes here
        /..
    }
 }
<script>
    myModule.init();
</script>