2010-03-23 42 views
4

我已经创建了一个与Dom一起工作的脚本,因此它必须等到Dom完成之后才能执行每个操作。我希望这个脚本可以包含在两个方面:Firefox DOMContentLoaded事件问题

  • 在head标签中,以便在Dom准备好之前加载它。我已经使用document.addEventListener("DOMContentLoaded",function(){...},false)这个,它运作良好
  • 当Dom已经加载dinamically加载。在这种情况下,脚本不起作用,因为如果Dom已经加载的DomContentLoaded事件没有被解雇的原因

所以我想知道,有没有办法来检查,如果Dom已经加载以便脚本可以在不使用DOMContentLoaded事件的情况下执行代码?

PS:这必须是一个外部脚本,所以我必须在那里将被列入

回答

2

好吧,这是俗气,但它应该工作: 总结你的外部脚本在init()方法:

例如(我只是猜测这里)

var myModule = { 

    init: function { 
     //all the code goes here 
     /.. 
    } 
} 

然后把你的脚本导入回头标记,并在你的DOM标记的最底部添加脚本标签

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

我再次止跌”吨通常建议它,但如果你需要避免检查DOM的加载事件,我会做

0

一做这将是检查是否可以在最后的getElementById的东西,最简单的方法在网页上的控制的页面。例如:

if (document.getElementById('footer')) { /* Dom is probably loaded */ } 
else { /* Dom is probably NOT loaded */ } 

但实际上,最好的做法可能是确保代码总是以相同的方式调用。您可以使用“onload”事件,因为这可以在所有浏览器中使用,并且通常在DOMContentLoaded事件之后只需几分之一秒。但是,我想这真的取决于你。

+1

我已经想过这种方法,但我不知道页面中有哪些元素,所以我无法检查元素的存在,并且出于同样的原因,我无法使用onload事件。 – mck89 2010-03-23 15:03:54

0

定义你的函数: function domReadyHandler() { /* ... */ }

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

执行处理后,动态加载您的内容,也: function myXhrCallback() { /* ... */; domReadyHandler(); }

+0

这意味着我必须更改站点的整个系统,但我只想使用脚本。 – mck89 2010-03-23 15:07:15

+0

我认为你在XHR上使用了一个包装。如果是这样,也许你可以在XHR响应完成时手动触发“DOMContentLoaded”? – janmoesen 2010-03-23 15:35:04

+1

不,我不使用任何XHR包装,并且此脚本不能依赖于任何库,这必须是外部脚本,因此我无法控制该网站的HTML代码。 – mck89 2010-03-23 15:53:55

0

您可以设置一个全局变量说该脚本将被动态地包含在内,根据这一点,您可以在脚本被评估时触发负载监听器。

window.SCRIPT_IS_DYNAMICALLY_LOADED = true; 
< include script> 

在脚本:

if (window.SCRIPT_IS_DYNAMICALLY_LOADED) { 
    domContentLoadedListener(); 
} else { 
    document.addEventListener("DOMContentLoaded",domContentLoadedListener, false); 
} 
+1

这必须是一个外部脚本,所以我无法控制它将被包含在网页上 – mck89 2010-03-23 16:10:38

0

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