在页面DOM加载后得到通知(但在window.onload之前)
我知道有一些方法可以在页面正文加载时得到通知(在加载所有图像和第三方资源之前,这会触发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,它就会立即执行,这是最后的一件事。