3

在下面的脚本中,只要 jQuery.js 包含在 defer 属性中,我就会收到“未捕获的 ReferenceError:未定义 jQuery”错误。调用 jQuery 对象的内联脚本也被延迟,这没有什么区别。

我正在尝试推迟脚本以加快页面渲染速度。

是否可以推迟 jQuery 而不会出现这样的错误?

未捕获的 ReferenceError:未定义 jQuery

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>jQuery defer test</title>
<link rel="stylesheet" href="styles.css" media="screen" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />
<!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>
<body>
    <p>content goes here...</p>
    <script type='text/javascript' src='scripts.jquery.js' defer='defer'></script>
    <script defer='defer'>
    jQuery(document).ready(function(){
        alert('deferred');
        });
    </script>
</body>
</html>
4

2 回答 2

2

defer 属性只影响外部脚本。因此,您的内联 javascript 将始终在外部 jQuery 资源之前执行。

来自http://www.w3.org/html/wg/drafts/html/master/scripting-1.html#attr-script-defer

The defer and async attributes must not be specified if the src attribute is not present.

不幸的是,对于大多数网站来说,因为他们需要jQuery(function() {})在 DOM 准备好之后才能访问 init,这几乎迫使您在头部加载 jQuery。这是从外部 Google CDN 提供 jQuery 的主要原因之一,因为它有可能已经被您的用户(来自另一个站点)缓存,并且它的交付时间可能比您自己的 Web 服务器快得多。

有几种方法可以解决这个问题,比如注册你自己的临时jQuery对象来存储你的 dom 就绪函数,但它有它的缺点。

于 2013-06-21T18:20:55.717 回答
0

您可以使用defer但只能用于外部脚本!

于 2013-06-21T18:25:34.050 回答