Javascript 是否真的需要等待DOM准备好操作DOM?

Javascript 是否真的需要等待DOM准备好操作DOM?,javascript,jquery,events,dom,Javascript,Jquery,Events,Dom,如果代码只处理已经完全解析的DOM元素,那么是否真的需要等待“ready”(或“window.onload”)事件 的jQuery文档演示了如何等待执行操作,直到DOM完全就绪,但示例中的代码(脚本标记)列在相关DOM元素之前。但是似乎在HTML文档中必要的DOM元素之后出现的代码可以访问它们,因为据推测,DOM是在浏览器解析文档时构建的 例如,假设以下代码在所有情况下都是可靠的,或者使用ready/onload处理程序仍然是必要的(或有益的)吗 <body> <div i

如果代码只处理已经完全解析的DOM元素,那么是否真的需要等待“ready”(或“window.onload”)事件

的jQuery文档演示了如何等待执行操作,直到DOM完全就绪,但示例中的代码(脚本标记)列在相关DOM元素之前。但是似乎在HTML文档中必要的DOM元素之后出现的代码可以访问它们,因为据推测,DOM是在浏览器解析文档时构建的

例如,假设以下代码在所有情况下都是可靠的,或者使用ready/onload处理程序仍然是必要的(或有益的)吗

<body>
  <div id="foo"/>
  <script type="text/javascript">
    var foo = document.getElementById('foo');
    foo.innerHTML = 'The element #foo is loaded!';
  </script>
</body>

var foo=document.getElementById('foo');
foo.innerHTML='元素#foo已加载!';

非常类似,但我想点击它,看看是否还有更多信息。

如果您的JavaScript代码位于DOM元素之下,并且只以独占方式修改它们,则无需等待DOM就绪事件

但是,请记住编辑一个DOM元素,该元素包含IE6(感谢)和IE7中使用的
脚本
元素(或者更具体地说,在元素的结束标记之前)


但是,这需要内联
脚本
,这可能是一个维护问题。最好将JavaScript存储在外部(很多人都说在结束
正文
标记之前包含JavaScript的好处),以获得许多好处,例如易于维护和细粒度缓存控制。

是,如果js代码在dom之后,这是安全的,但通常混合html和js不是一个好主意。

在您的情况下,这是好的,因为浏览器将逐行呈现代码,并在代码id=“foo”中呈现首先出现,因此它将获得该div….但是假设您在head标记中编写了该脚本,那么脚本将首先运行,并且它不会获得id=“foo”的div,因为它尚未加载..最好是在document中编写。ready方法以线性方式加载document,以便您的代码正常工作。
有时,当javascript不依赖于它下面的DOM时,程序员不会使用DocumentReady来实现性能。以下是一些。

+1,用于您的第一段和第二段@maerics,请参阅Google Closure library团队关于何时可以操作元素的内容(相当好的权威,Closure library每天被数百万人使用)@亚历克斯:你的第三段没有多大意义。您谈到内联
script
元素在下载时阻止执行,然后谈到将JavaScript存储在外部。@T.J.感谢您的投票。我应该如何改进我的答案?这是错误的还是措辞含糊不清?@alex:关于第三段,我认为主要是措辞。你的更新删除了关于“下载”的内容,这对你很有帮助。这个IE错误很有趣。请注意,链接的文章及其参考资料暗示(在某些情况下实际上是这样说的)只有当脚本代码直接位于
脚本
(而不是外部文件)中时才会发生这种情况。这是不正确的。不管脚本代码来自何处(元素本身或外部文件的主体),关键是修改未关闭元素的内容,而不是直接父元素。例如,这将在IE6中触发它,即使
脚本
元素引用了一个外部文件:@T.J。你从来没有遇到过这个bug吗?认为自己是幸运的)。我在某些开源应用程序中发现了它。