【发布时间】:2011-08-16 16:52:00
【问题描述】:
让我们面对现实吧,jQuery/jQuery-ui 下载量很大。
Google 建议使用deferred loading of JavaScript 来加快初始渲染速度。我的页面使用 jQuery 来设置一些位于页面下方的选项卡(主要是在初始视图之外),我想将 jQuery 推迟到页面呈现之后。
Google 的延迟代码在页面加载后通过钩子到正文 onLoad 事件向 DOM 添加一个标签:
<script type="text/javascript">
// Add a script element as a child of the body
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "deferredfunctions.js";
document.body.appendChild(element);
}
// Check for browser support of event handling capability
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
我想以这种方式推迟 jQuery 的加载,但是当我尝试它时,我的 jQuery 代码找不到 jQuery(对我来说并非完全出乎意料):
$(document).ready(function() {
$("#tabs").tabs();
});
所以,看来我需要找到一种方法来推迟我的 jQuery 代码的执行,直到 jQuery 被加载。如何检测到添加的标签已经完成加载和解析?
作为推论,asynchronous loading 似乎也可能包含答案。
有什么想法吗?
【问题讨论】:
-
为什么不在页面底部而不是头部包含 jQuery(和您自己的 JS 文件)?
-
Google 说(在我提供的第一个链接中),“必须先下载、解析和执行脚本,然后浏览器才能开始呈现网页”。这意味着在页面底部加载 jQuery 意味着在 jQuery 被解析和执行之前页面仍然不会被渲染。有没有办法异步加载它并让它在页面加载后完成它的工作?
-
你不能
defer你所有的外部脚本吗?它们应该仍按列出的顺序执行。 -
@nilskp 对于这个问题,似乎有一个现有的和公认的最佳实践,这就是我提出它的原因,而不是尝试自己推出。各种浏览器在这一领域存在大量陷阱。
-
如果您推迟所有脚本,它们将(或至少应该)以相同的顺序加载,只需在浏览器认为最佳时加载即可。然而,异步将允许 js 文件以浏览器认为合适的任何顺序加载。因此,如果您推迟包括 JQuery 库在内的所有脚本文件,您应该不会有任何问题。
标签: javascript jquery pagespeed