Jquery代码应该在页眉还是页脚中?

Sim*_*one 185 jquery header footer

放置Jquery代码(或单独的Jquery文件)的最佳位置在哪里?如果我把它放在页脚中,页面会加载得更快吗?

3zz*_*zzy 227

把脚本放在底部

脚本引起的问题是它们阻止了并行下载.HTTP/1.1规范建议浏览器每个主机名并行下载不超过两个组件.如果您从多个主机名提供图像,则可以并行执行两次以上的下载.但是,在下载脚本时,即使在不同的主机名上,浏览器也不会启动任何其他下载.在某些情况下,将脚本移到底部并不容易.例如,如果脚本使用document.write插入页面内容的一部分,则无法在页面中向下移动.可能还存在范围问题.在许多情况下,有办法解决这些问题.

经常出现的另一种建议是使用延迟脚本.DEFER属性指示脚本不包含document.write,并且是浏览器可以继续呈现的线索.不幸的是,Firefox不支持DEFER属性.在Internet Explorer中,脚本可能会延迟,但不是所需的.如果可以延迟脚本,也可以将其移动到页面底部.这将使您的网页加载速度更快.

编辑:自版本3.6以来,Firefox确实支持DEFER属性.

资料来源:

  • +1给出最佳答案而不是接受答案 (47认同)
  • ...在多数情况下. (4认同)
  • 我已经看到了一些现代建议,即脚本应放在顶部.将脚本放在底部允许页面正文中的图像和其他内容并行加载,但有效地导致页面中的脚本稍后加载 - 整个HTML正文需要在浏览器知道之前下载要加载的脚本URL.大多数人都参考雅虎指南,这不再准确 - Firefox确实尊重脚本上的延迟属性.如果您测量它,顶部的延迟将导致更快的页面加载. (4认同)
  • +1我第二,这是正确的方法 (2认同)
  • 更新:截至 2016 年初/中期,所有现代浏览器已将每个主机名的连接数增加到至少 6 个。 (2认同)

Cha*_*evy 185

应该最后加载所有脚本

几乎在每种情况下,最好将所有脚本引用放在页面的末尾,就在之前</body>.

如果由于模板问题等原因而无法执行此操作,请使用defer属性修饰脚本标记,以便浏览器知道在下载HTML后下载脚本:

<script src="my.js" type="text/javascript" defer="defer"></script>
Run Code Online (Sandbox Code Playgroud)

边缘情况

还有一些边缘情况,但是,在这里你可能会遇到页面闪烁或页面加载过程中的其他文物,其通常可以通过简单地将您的jQuery脚本引用中要解决<head>的标签没有defer属性.这些案例包括jQuery UI和其他插件,如jCarousel或Treeview,它们将DOM作为其功能的一部分进行修改.


进一步的警告

必须在DOM或CSS之前加载一些库,例如polyfill.Modernizr是一个必须放在head标签中的库.

  • ChadLevy是对的:如果在`<head>`中引用jQuery插件,jQuery插件有一些条件可以更好地工作.如果您的标记依赖于jQuery插件为您整理内容,那么将插件引用放在页面底部是没有意义的,因为您将在网页中获得时髦的标记,直到插件加载为止.规则应该被遵循,直到它们不再起作用,此时规则应该被打破. (9认同)
  • 好吧,请考虑一下:http://themeforest.net/item/portfolious-professional-business-template/full_screen_preview/47805.这是我最近购买的网站主题,其主页上的jQuery与jCarousel一起使用.当我将脚本块从头部移动到文件末尾时,我注意到轮播中使用的图像将在页面加载期间一次显示,而当脚本文件位于头部时,页面将更加平滑地加载. (5认同)
  • 使用CSS设置内容的初始状态.CSS应该在头脑中.打破某些东西以使其他东西发挥作用并不是解决方案.如果访问者必须等待jQuery和所有相关插件在呈现任何内容之前加载,她可能不会保持足够长的时间来查看内容. (5认同)
  • @Duncan:理想情况下,您可以控制所有依赖项.关于jQuery(更具体地说是jQuery UI和其他插件之类的东西)的设计是你无法完全控制它们的功能,因此如果向DOM元素添加类似于可见性属性的内容以便更加优雅地加载它可能是不可能的.使用该元素的插件不会考虑所述属性.有时最好违反一个简单的约定,而不是尝试让依赖项以你想要的方式工作. (2认同)
  • @Stefan:如果你的jQuery插件不允许操纵DOM,那么重点是什么? (2认同)

vir*_*yes 30

当然只能通过CDN加载jQuery本身.

为什么?在某些情况下,您可能包含一个带有嵌入式jQuery依赖代码的部分模板(例如ajax登录表单片段); 如果在页面底部加载jQuery,则会出现"$ is not defined"错误,很好.

当然有办法解决这个问题(例如没有嵌入任何JS并附加到底部加载的js包),但为什么会失去延迟加载js的自由,能够在任何地方放置jQuery依赖代码?只要满足依赖项(如加载jQuery),Javascript引擎就不关心代码在DOM中的位置.

对于你的公共/共享js文件,是的,将它们放在之前</body>,但是对于例外,在html的那一点上,将应用程序维护明智地粘贴到jQuery依赖的片段或文件引用是有意义的,这样做.

在头部加载jquery没有性能损失; 这个星球上的什么浏览器还没有缓存中的jQuery CDN文件?

很多关于什么都不做的事情,坚持jQuery,让你的js自由统治.


EMP*_*EMP 13

Nimbuz对所涉及的问题提供了一个非常好的解释,但我认为最终的答案取决于你的页面:对于用户来说更重要的是什么 - 脚本或图像?

有些页面在没有图像的情况下没有意义,但只有轻微的,非必要的脚本.在这种情况下,将脚本放在底部是有意义的,这样用户可以更快地看到图像并开始理解页面.其他页面依赖于脚本来工作.在这种情况下,没有图像的工作页面比带有图像的非工作页面更好,所以将脚本放在顶部是有意义的.

另一件需要考虑的事情是脚本通常比图像小.当然,这是一个概括,你必须看看它是否适用于你的页面.如果确实如此,对我来说,这是一个将它们放在第一位作为经验法则的论据(即,除非有充分的理由不这样做),因为它们不会像图像延迟脚本一样延迟图像.最后,将脚本放在顶部会更容易,因为您不必担心在需要使用它们时是否已加载它们.

总之,我倾向于默认将脚本放在顶部,只考虑在页面完成后是否值得将它们移到底部.这是一个优化 - 我不想过早地做到这一点.

  • 哦,好吧,不能全部赢!我相信我理解它的含义.:) (6认同)
  • 鉴于普遍的共识是将脚本放在最底层,默认情况下这样做不是更好吗,只有在遇到问题时才将它们移到顶端?向后做事似乎很奇怪.如果消耗的努力没有差别,有时候做最好的事情会更好:) (4认同)

Ste*_*all 6

大多数jquery代码都是在文档准备好的情况下执行的,直到页面结尾才会发生这种情况.此外,页面呈现可以通过javascript解析/执行来延迟,因此最好将所有javascript放在页面底部.


Rob*_*vey 5

标准做法是将所有脚本放在页面底部,但我使用 ASP.NET MVC 和许多 jQuery 插件,我发现如果我将 jQuery 脚本放在<head>master 部分,效果会更好页。

就我而言,如果脚本位于页面底部,则在加载页面时会出现工件。我正在使用 jQuery TreeView 插件,如果在开始时没有加载脚本,树将在没有插件强加给它的必要 CSS 类的情况下呈现。所以当页面第一次加载时,你会看到这个看起来很有趣的混乱,然后是 TreeView 的正确呈现。很不好看。将 jQuery 插件放在<head>母版页的部分可以消除这个问题。

  • @Dan Beam:Treeview 是从数据库表中填充的,Treeview 的样式是由 Treeview 插件根据表的内容设置的,所以不,这是行不通的。 (2认同)
  • 当我可以将未修改的 Treeview 插件脚本放在页面顶部时,为什么要这样做,它会正常工作?这没有任何意义,丹。 (2认同)