在页面DOM加载后得到通知(但在window.onload之前)

时间:2020-03-05 18:54:11  来源:igfitidea点击:

我知道有一些方法可以在页面正文加载时得到通知(在加载所有图像和第三方资源之前,这会触发window.onload事件),但是对于每个浏览器而言,它都是不同的。

在所有浏览器上都有确定的方法吗?

到目前为止,我知道:

  • DOMContentLoaded:在Mozilla,Opera 9和最新的WebKit上。这涉及向事件添加侦听器:document.addEventListener(" DOMContentLoaded",[init function],false);
  • 延迟脚本:在IE上,我们可以发出带有@defer属性的SCRIPT标记,该标记只有在关闭BODY标记后才能可靠地加载。
  • 轮询:在其他浏览器上,我们可以继续轮询,但是甚至没有标准的东西可以轮询,还是需要在每个浏览器上执行不同的操作?

我希望能够不使用document.write或者外部文件。

这可以简单地通过jQuery完成:

$(document).ready(function() { ... })

但是,我正在写一个JS库,不能指望jQuery总是在那儿。

解决方案

回答

只需从jQuery中获取相关代码,John Resig就已经涵盖了jQuery中有关此问题的大部分基础。

回答

这很好用:

setTimeout(MyInitFunction, 0);

回答

没有跨浏览器的方法可以检查DOM是否准备就绪-这就是为什么存在jQuery之类的库来抽象出讨厌的一点不兼容的原因。

Mozilla,Opera和现代WebKit支持DOMContentLoaded事件。 IE和Safari需要怪异的技巧,例如滚动窗口或者检查样式表。血腥的细节包含在jQuery的bindReady()函数中。

回答

YUI使用三​​个测试来执行此操作:对于Firefox和最近的WebKit,将触发一个DOMContentLoaded事件。对于较旧的Safari,document.readyState会一直监视,直到"加载"或者"完成"为止。对于IE,将创建HTML <P>标记,并调用" doScroll()"方法,如果DOM未准备好,该方法将出错。 YAHOO.util.Event的源显示了特定于YUI的代码。在Event.js中搜索" doScroll"。

回答

使用类似jQuery的库将为我们节省无数小时的浏览器不一致问题。

在这种情况下,我们可以使用jQuery

$(document).ready ( function () {
    //your code here
});

如果我们感到好奇,可以看一下资料来源,看看它是如何完成的,但是在如今的这个时代,我认为当图书馆作家为我们完成所有痛苦的工作时,没有人应该重新发明这个轮子。

回答

我找到了此页面,该页面显示了一个紧凑的独立解决方案。它似乎可以在每种浏览器上运行,并且对如何进行解释:

http://www.kryogenix.org/days/2007/09/26/shortloaded

回答

使用setTimeout可以很好地工作,尽管它的执行时间取决于浏览器。如果我们将超时时间设置为零,则当事情"解决"时,浏览器将执行。

这样做的好处是我们可以拥有许多控件,而不必担心链接onLoad事件。

setTimeout(myFunction, 0);
setTimeout(anotherFunction, 0);
setTimeout(function(){ doSomething ...}, 0);

等等。

它们将在文档加载完成后全部运行,或者如果我们在文档加载后设置了它们,则它们将在脚本运行完毕后运行。

它们的运行顺序不确定,可以在浏览器之间更改。因此,例如,我们不能指望在" anotherFunction"之前运行" myFunction"。

回答

为什么不这样:

<body>  
  <!-- various content -->  
  <script type="text/javascript">  
  <!--  
    myInit();  
  -->
  </script>  
</body>

如果我正确理解了一切,那么只要浏览器在页面中击中myInit,它就会立即执行,这是最后的一件事。