来自1.3 release notes:
ready() 方法不再尝试保证等待所有样式表被加载。相反,所有 CSS 文件都应包含在页面上的脚本之前。 More Information
来自ready(fn) documentation:
注意:请确保所有样式表都包含在您的脚本之前(尤其是那些调用 ready 函数的)。这样做将确保在 jQuery 代码开始执行之前正确定义所有元素属性。不这样做会导致零星的问题,尤其是在基于 WebKit 的浏览器(例如 Safari)上。
请注意,上述内容甚至不是关于实际渲染 CSS,因此当ready() 启动时,您可能仍会看到屏幕变化。但它应该可以避免您遇到问题。
其实我觉得有点奇怪,只是把 CSS 放在 JS 上面就可以解决所有问题。 CSS 是异步加载的,因此 JS 加载可以在 CSS 仍在下载的同时开始和结束。那么如果以上是一个解决方案,那么执行任何 JS 代码都会暂停,直到所有之前的请求都完成?
我做了一些测试,确实,有时 JS 会延迟到 CSS 加载完成。我不知道为什么,因为瀑布显示JS在下载CSS完成之前很久就完成了加载。
some HTML 和 its results 参见 JS Bin(这有 10 秒延迟),its waterfall results 参见webpagetest.org。这使用了来自 Steve Souders 的 cuzillion.com 的一些脚本来模拟缓慢的响应。在瀑布中,对 resource.cgi 的引用是 CSS。因此,在 Internet Explorer 中,第一个外部 JS 在请求 CSS 后立即开始加载(但该 CSS 将需要另外 10 秒才能完成)。但是第二个<script> 标记在 CSS 完成加载之前不会执行:
<link rel="stylesheet" type="text/css" href=".../a script that delays.cgi" />
<script type="text/javascript" src=".../jquery.min.js"></script>
<script type="text/javascript">
alert("start after the CSS has fully loaded");
$(document).ready(function() {
$("p").addClass("sleepcgi");
alert("ready");
});
</script>
Another test 在获取 jQuery 后使用第二个外部 JS,shows 表示直到 CSS 加载后才开始下载第二个 JS。这里,resource.cgi 的第一个引用是 CSS,第二个是 JS:
移动样式表下面所有 JS 确实表明 JS(包括 ready 函数)运行得更早,但即便如此 jQuery 应用的类——当 JS runs-- 在我的 Safari 和 Firefox 快速测试中正确使用。但是像$(this).height() 这样的东西在那个时候会产生错误的值是有道理的。
但是,additional testing 表明 在加载之前定义的 CSS 之前停止 JS 不是一般规则。使用外部 JS 和 CSS 似乎有一些组合。我不知道这是怎么回事。
最后一点:由于JS Bin在从裸URL运行时在每个脚本中都包含Google Analytics(如jsbin.com/aqeno,测试结果实际上是由JS Bin改变的...看起来编辑 URL 上的输出选项卡(例如 jsbin.com/aqeno/edit)不包含额外的 Google Analytics(分析)内容,并且肯定会产生不同的结果,但该 URL 很难使用webpagetest.org 进行测试。strager 给出的对Stylesheets Block Downloads in Firefox and JavaScript Execution in IE 的引用是一个更好的理解的良好开端,但我还有很多问题......另请注意 Steve Souders 的IE8 Parallel Script Loading,这会使事情变得更加复杂。(上面的瀑布是使用 IE7 创建的。)
也许人们应该简单地相信发行说明和文档...