在哪里放置Jquery代码(或单独的Jquery文件)最好?如果将其放在页脚中,页面是否会加载更快?
答:为了获得最佳性能,建议将Jquery代码放在head中。将其放置在页脚可能会导致页面加载延迟,影响用户体验。脚本导致的问题是它们会阻塞并行下载。HTTP/1.1规范建议浏览器每个主机名最多下载两个组件。如果您从多个主机名提供图像,则可以使超过两个下载同时进行。然而,在下载脚本的过程中,浏览器不会开始任何其他下载,即使在不同的主机名上也是如此。在某些情况下,将脚本移动到底部并不容易。例如,如果脚本使用document.write向页面内容中插入一部分,则无法将其移到页面较低的位置。还可能存在作用域问题。在许多情况下,有方法可以解决这些问题。
经常出现的另一个建议是使用延迟脚本。DEFER属性指示脚本不包含document.write,并提示浏览器可以继续呈现。不幸的是,Firefox不支持DEFER属性。在Internet Explorer中,脚本可以被延迟,但未达到预期的效果。如果可以延迟脚本,则也可以将其移至页面底部。这将使网页加载速度更快。
编辑:自Firefox 3.6版起,Firefox支持DEFER属性。
来源:
所有脚本都应该在最后加载
在几乎所有情况下,最好将所有脚本引用放置在页面末尾,就在</body>
之前。
如果由于模板问题等原因无法这样做,可以使用defer
属性来修饰脚本标签,使浏览器知道要在 HTML 下载完成后下载您的脚本:
<script src="my.js" type="text/javascript" defer="defer"></script>
边缘情况
然而,在某些边缘情况下,您可能会在页面加载期间遇到页面闪烁或其他伪像,这通常可以通过将jQuery脚本引用放置在<head>
标签中没有defer
属性来解决。这些情况包括jQuery UI和其他附加组件,如jCarousel或Treeview,它们作为其功能的一部分修改DOM。
进一步的注意事项
有一些库必须在DOM或CSS之前加载,例如polyfills。Modernizr就是这样的一个库,必须放置在head标签中。
<head>
中,它们会起到更好的作用。如果您的标记依赖于jQuery插件为您整理内容,那么将插件引用放在页面底部就没有意义了,因为在插件加载之前,您的网页中将出现奇怪的标记。规则存在是为了被遵循,直到它们不再适用,这时候就应该打破规则。 - Robert Harvey仅在头部加载jQuery,当然要通过CDN。
为什么?在某些情况下,您可能会包含一个带有嵌入式jQuery依赖代码的部分模板(例如ajax登录表单片段); 如果在页面底部加载jQuery,则会出现“未定义 $”错误,很不好。
当然有一些解决方法(例如不嵌入任何JS并将其附加到在底部加载的js捆绑包中),但是为什么失去延迟加载js的自由以及能够随意放置依赖于jQuery的代码呢?只要满足依赖项(如已加载的jQuery),Javascript引擎就不会在DOM中的代码位置上产生影响。
对于您的常见/共享JS文件,请将它们放在</body>
之前,但对于例外情况,在html的特定点处粘贴一个依赖于jQuery的片段或文件引用真的是明智的选择,那就这样做吧。
在头部加载jquery不会影响性能;全球哪个浏览器没有jQuery CDN文件缓存在本地?
关于这个问题多说无益,把jQuery放在头部,让您的js自由发挥吧。
2%
中,假设有一半的访问者会在页面首次加载前离开。这样你就失去了1%
的访问量,但可能会节省大量的开发时间和麻烦。看看这是否符合你的商业模式... - Sergey Orshanskiy大多数jQuery代码都在文档就绪后执行,而这个时间点一般要等到页面加载结束才会发生。此外,JavaScript的解析/执行可能会延迟页面渲染,因此最好将所有JavaScript放在页面底部。
@Html.Action
时,我遇到了问题,因为我的部分视图会出现“$未定义”的错误,这意味着我必须使用.load('@Url.Action')来加载部分视图。但是,由于额外的请求,这会导致FOUC问题。根据您的建议,我将把jquery移到主页的RenderBody()之前。 - Malkin