如果您有 JS 代码旨在作为加载/构建页面的一部分运行,那么它应该放在 HTML 中的什么位置?例如修改 <div>
或者添加一些链接。
这应该放在 <body>
中吗? , 穿插 HTML?或者它应该在 <head>
之间和 <body>
元素?事情发生的顺序是什么 - 它们在页面中的顺序还是 HTML 是否全部发生在(非 <head>
)JS 运行之前?
最佳答案
If you have JS code which is intended to run as part of loading/building the page, where in the HTML should this go?
收盘前</body>
标签正在成为最佳实践,除非有特定要求将其放在其他地方(有时可能会有)。这是 recommendation of the YUI folks ,例如,但不仅仅是他们。
What order do things happen in - the order they are in the page or does HTML all happen before (non-) JS is run?
当 script
遇到标记,除非您使用 defer
or async
attribute (并且浏览器支持它们),所有 HTML 解析都戛然而止,脚本被下载并交给 JavaScript 解释器。当 JavaScript 解释器完成处理脚本时,HTML 解析器可以继续。它必须这样做,因为 JavaScript 可以通过 document.write
将标记插入到 HTML 流中。 .这也是为什么您可以加载一个脚本文件,然后加载依赖于第一个脚本文件的第二个脚本文件,并且知道它们将以正确的顺序加载。 也是为什么你不能从更高层的脚本访问 HTML 流中更底层的元素,除非你以某种方式推迟你的代码(window.onload
或许多库的“DOM 加载”事件支持,例如 jQuery 的 ready
或 Prototype 的 dom:loaded
)。
这样做的一个结果是,将 script
head
中的标签实际上会减慢页面的明显加载时间,除非那些 script
出于某种原因,标签需要在那里。因此建议将它们放在收盘前 </body>
标签。
但是,您必须注意一个“陷阱”:如果您希望使用 JavaScript 响应页面的某些部分(如果用户已启用它),那么在最后加载脚本会留下一个简短但真实的结果存在竞争条件:用户可以在下载脚本时与页面进行交互。有多种处理方法。我最喜欢的是在 head
中检测是否使用 内联 脚本(不是单独的文件)启用了 JavaScript元素,如果是这样,则尽可能为事情放置一个文档级处理程序(例如,您可以使用 click
事件执行此操作),这基本上会在非常短的时间内排队或禁用点击。这样,如果启用了 JavaScript,您将避免竞争条件,但如果未启用,任何 unobtrusive您已准备好的后备措施将起作用。
关于javascript - JS 脚本应该放在 HTML 文件中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5220313/