据我所知:
$(document).ready()
但令我惊讶的是,以下作品意外:
<html>
<head>
</head>
<body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>This should show !</h1>
<script>
$(document).ready(function() {
// Intentional infinite loop
for(var i=0; i<100; i++) {
i--;
}
});
</script>
<h1>This should *not* show !</h1>
</body>
</html>
执行上述操作后,它会进入无限循环并显示空白屏幕。
在进入无限循环之前,预计会在屏幕上看到这应该显示!。
更新
UPDATE2
css
上呈现块,这里没有使用(评论?)UPDATE3
发生了什么?
答案 0 :(得分:0)
如果您阅读jQuery文档已准备就绪,您应该记下In most cases, the script can be run as soon as the DOM hierarchy has been fully constructed.
行。我从这一行中得到的结论是,这并不一定意味着页面会显示。因此,即使您没有任何css
代码,也不意味着您的文档会显示。
以下是StackOverflow问题的链接,可以很好地解释这一点:window.onload vs $(document).ready()
以下是指向整个页面呈现过程的页面的链接:http://friendlybit.com/css/rendering-a-web-page-step-by-step/
如果您注意到上述链接中的步骤18,那么在所有HTML&amp;加载CSS,并在执行Javascript后,实际打印页面。以下StackOverflow问题包含了进一步说明这一点的良好链接:Describe the page rendering process in a browser?
进一步澄清(对更新3的回应):
这是我对friendlybit文章的总结:
document.ready()
,Javascript就在里面执行。这是一个在工作中显示此功能的JSFiddle(您需要打开控制台才能看到它有效):http://jsfiddle.net/aLbmB/
JSFiddle在执行Javascript之前向您显示两个标题元素已解析。如果将for循环中的代码更改为以下内容:
$("#header2").text($("#header2).text() + "----");
i--;
您将看到文本永远不会呈现,这有望显示Javascript正在执行,因此,您实际上从未实际访问页面呈现部分。另一个很好的例子是当你通过jQuery从数据库中提取数据并等待所有数据加载时。数据集越大,页面加载所需的时间越长(即使HTML代码已经存在)。
我在逻辑上考虑这个问题的方式是,在对它们执行任何Javascript之前,首先要很好地设置所有值。然后执行Javascript,一旦完成所有操作,您就可以让用户查看您的成品。当然,当你不使用document.ready()
时就不是这种情况,但我想那里的权衡是速度与可预测性(执行中)。
额外注释(由lazertyuiopl提供):
"you can trigger a paint of already parsed elements using alert()"
提出了一个很好的观点。如果这样做,那么看起来好像每个元素都是从上到下一次绘制一个。我建议检查这个JSFiddle:http://jsfiddle.net/K9kG8/7/
加载后再次运行它,你会看到我相信Yugal Jindle的预期。
除此之外:我认为这个问题并不重复,而是通过另一个问题的答案可以澄清的更多问题。换句话说,一个具体的例子。
答案 1 :(得分:0)
以下是发生的事情:(感谢 @Zhouster 获取灵感)
<html>
<head>
</head>
<body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>This should show !</h1> <!-- 1st h1 -->
<script>
$(document).ready(function() { // Mistake: Will be executed later when parse-tree is complete
// Infinite loop
for(var i=0; i<100; i++) {
i--;
console.log($("h1").text()); // Prints both 1st & 2nd h1 in console
}
});
</script>
<h1>This should *not* show !</h1> <!-- 2nd h1 -->
</body>
</html>
$(document).ready(function() { ... });
包含回调函数,当解析树完成时,将执行文档就绪的定义。稍有不同 - 突出概念:
<html>
<head>
</head>
<body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h1>This should show !</h1> <!-- 1st h1 -->
<script>
// **** Without document ready ****
// Not an infinite loop
for(var i=0; i<100; i++) {
console.log($("h1").text()); // Prints only 1st h1
}
// **** Document ready ****
$(document).ready(function() {
// Not an infinite loop
for(var i=0; i<100; i++) {
console.log($("h1").text()); // Prints both 1st & 2nd h1 in console
}
});
</script>
<h1>This should *not* show !</h1> <!-- 2nd h1 -->
</body>
</html>
神秘解决:)
答案 2 :(得分:-1)
你的观念是错误的。
将呈现html并且脚本不会阻止呈现html。但就绪处理程序脚本仅在文档准备就绪后才会调用。
答案 3 :(得分:-1)
这就是Document ready和window.load之间的区别
DOM结构已准备就绪,可以查询。更好的测试是运行jQuery选择器并确认页面上的所有元素都是可访问的。它并不一定意味着要渲染元素。
这是因为,大多数浏览器都会隐藏元素,直到解析CSS为止。