为什么把JavaScript放在首位
如果在</body>
之前放置JavaScript是完全可以接受的,那么将它保存在<head>
是一个很好的理由吗?
基于<head>或</ body>之前的JavaScript问题? 许多答案指出,如果将页面放在</body>
标签之前,页面加载速度会更快。
但是我没有看到为什么它应该保存在<head>
中的任何合理的论点。 我问,因为我不是一个非常强大的JavaScript开发人员,从我读过的和看到的所有内容中,标准是将大多数JavaScript代码和外部引用保留在<head>
。
头部中的任何东西都必须在body加载之前完成,因此将javascript放在那里通常是个不错的主意。 如果你在身体装载的时候需要一些东西,或者想要加速一些AJAX,那么把它放在头上是适当的。
这背后的原因是Head
被装到身体之前。 任何在加载时执行的dynamicJavaScript代码将正确执行。
如果您的JavaScript标签位于</body>
标签之前,那么您的页面在加载时所做的JavaScript调用将会出错。
所以是在</body>
标签之前加载JavaScript将加载更快。 但只有当您的JavaScript将通过点击页面加载后执行例如。
如果您需要JavaScript来完成页面上的某些内容,并且您不希望最终用户在完成该内容之前查看内容,那么您应该将其包含在头部中。 这真的取决于每个个案。
大多数时候,把它放在底部真的是更好的优化页面下载,因为用户将甚至开始下载之前,看到页面上的所有内容。
将JS放在首位的唯一原因是用于修改浏览器实际呈现页面的脚本。 例如,Modernizr.js被加载到头部,以便在页面开始呈现之前,可以添加对HTML5元素的支持以及在<html>
标签上操作类。
否则,你的JS应该进入页面的底部。
过去,将JS放在首位的唯一原因是用于修改浏览器实际呈现页面的脚本(正如Chris Pratt指出的那样)。 今天,情况已经不是这样了,
-
如果您仍然关心IE 10中的支持和性能,那么仍然是让您的脚本标记HTML主体的最后一个标记的最佳方法。 这样,你就可以确定DOM的其他部分已经被加载了,你不会阻塞和渲染。
-
如果您对IE <10不再太在意,您可能希望将脚本放在文档的头部,并使用
defer
来确保它们只在加载DOM后运行(<script type="text/javascript" src="path/to/script1.js" defer></script>
)。 这种方法的defer
在于,defer
不会阻止加载其余的DOM。 如果你仍然希望你的代码在IE 10中工作,不要忘记把你的代码封装在一个window.onload
,尽pipe!
头部标签加载在身体之前,所以正确加载网站所需的Javascript应放在那里,但如果不是必需的,大多数人觉得最好把它放在身体标签的末尾。
传统上,页面没有用来validation(不pipe是XHTML严格validation,还是WAI-AAA合规性,我不记得具体是什么失败了,但是当脚本在主体中的时候失败了)。 这通常与将所有脚本放入外部文件并使用脚本src =“”标记链接到它们的build议一致。
逻辑:也许它被W3C推荐为保存最多语义标记的方法。 我认为,从历史上看,这个逻辑在互联网普遍慢得多的日子里很重要 – 一些浏览器被configuration为拒绝基于互联网连接诊断和设置的脚本和样式以及图像,并且具有脚本的方式告诉浏览器“如果连接性问题允许的话,拒绝这个脚本是可以的”,正文中的脚本在语义上被认为是内容的更多要素。 尽pipe这是一个微不足道的细节,并且基于W3C可能已经过时的build议,所以现在很难find一个真正以这种方式运行的浏览器。
现在只能影响页面在呈现时的行为。
警告:这不适用于不影响上面内容的脚本 – 最好通过将它们放在closures的body标签之前来延迟它们的加载,以便用户可以更快地看到上面的内容不得不等待渲染阻塞脚本加载)。 这是谷歌和雅虎关键的网页推荐
这是一个像“windows”或“mac”的问题,我认为,如果你把所有的JS源代码都放在网站的头部,那么你就会退出W3C。 另外一种情况是在头部必须装上身体元素。 而befor DOM正确加载。 像jQuery这样的JavaScript框架有$(document).ready()函数来检查完整的DOM是否被加载。 所以你可以在头标中做所有的JS。 我的偏好是加载所有JS在身体的尽头,但这个决定去每个开发自己的:)