来自this question的评论让我想到了什么。什么时候$(document).ready()
函数确实会触发?显而易见的答案是“当文件准备就绪时”,但究竟是什么时候?
例如,if I turned output buffering on and flushed my output while PHP continued executing,是否会将输出发送到浏览器?那么,在PHP脚本执行完毕之前,文档是否可以准备就绪,或者事件是否等到请求完成之后?
修改
响应似乎基本上同意当客户认为它准备就绪时会触发事件。
为了更好地理解(我本来应该做的事情),我只是设置了一个测试:
<?php ob_start(); ?>
<html>
<head>
<script type="text/javascript" src="lib/js/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
alert("READY");
});
</script>
</head>
<body>
<?php
ob_flush();
for ($i=0; $i<999999; $i++) {
echo "HELLO$i\n";
ob_flush();
}
?>
</body>
</html>
结果是在这个例子中,内容立即开始在页面上显示,但是在循环完成之前警报没有发生,或者脚本超时(30秒)。
根据您使用的浏览器,我尝试在循环中插入它:
if ($i == 99) {
echo "</body></html>";
}
Chrome似乎通过将这些标记放在页面的末尾来自动纠正它(如Web开发检查器中所示)。查看页面的来源显示它在中间,我在那里回应它。
答案 0 :(得分:6)
ready
事件。确切的机制取决于浏览器。
查看相关的source code。
首先,检查在尝试将侦听器绑定到事件时是否已经可以访问DOM。如果是,则调度回调计划立即启动 - 尽管它们实际上并未立即解雇,以允许已占用当前执行槽的代码在需要时取消处理程序。
如果DOM尚不可访问,则会尝试将事件侦听器绑定到浏览器的本机DOMContentLoaded
事件 - 这是要求浏览器在DOM处于时通知您的“正确”本机方式可用,但它是一个相对现代的功能。如果这是不可能的(这几乎可以肯定地表明您的代码在旧版本的IE中运行),代码可以回溯到几种机制:
onreadystatechange
事件。这不是万无一失的,会比DOMContentLoaded
更晚,但它还不错。load
对象的window
事件。这通常比DOM可用的时间晚得多,但确保事件最终会终结,这是最后的失败保障。从PHP的角度来看,在PHP脚本执行完毕之前,它可能可能(但不太可能)。有些情况(例如长轮询)会在脚本完成之前触发事件,但这只会发生在旧版浏览器中。但是,在这些情况下,您根本不会(不应该)使用这些事件,您只需将相应的<script>
元素放在页面正文中,以便在它们出现时立即执行加载,而不是等待DOM的其余部分。
就个人而言,由于这个原因,我从不或多或少地使用任何这些负载驱动的事件。 YMMV。
答案 1 :(得分:3)
例如,如果我在PHP继续执行时打开输出缓冲并刷新输出,那么不会将输出发送到浏览器吗?
是的,它会发送输出,但这并不意味着浏览器认为服务器已经完成。我知道这不是PHP,但我喜欢Perl文章Suffering from Buffering。当UserAgent认为它已准备就绪时,该文档已准备就绪。但是,浏览器会保持套接字打开,同时它仍然认为它正在接收数据并且没有发送END信号。
那么在PHP脚本执行完毕之前文档是否可以准备就绪,或者事件是否等到请求完成之后?
通常,浏览器将等到服务器完成数据发送。如果你正在刷新输出,那么当脚本仍在运行时,Web服务器可能会超时,例如,我认为Apache默认为2分钟。如果服务器发送结束信号,您的文档已经完成,您的浏览器可能会准备DOM并激活DOMReady事件,即使您的脚本仍在服务器上运行。
与其他一些评论相反</body>
和</html>
并不是DOM准备就绪的好指标,主要是因为页面可能格式错误(包含拼写错误或不包含这些结束标记)。在这些情况下,浏览器仍将在Quirksmode中渲染并激活DOMReady。
答案 2 :(得分:0)
根据jQuery网站,$( document ).ready()
只有在页面文档对象模型(DOM)准备好执行JavaScript代码后才会运行。
参考:http://learn.jquery.com/using-jquery-core/document-ready/
答案 3 :(得分:0)
在完全构造DOM层次结构并且不再需要执行PHP代码之后触发(因为PHP代码在页面发送之前执行)。
这意味着它会在客户端收到页面后立即执行。其他事情可能会在之后加载,例如图像,CSS和其他Javascript。
答案 4 :(得分:0)
Document.ready()
。当所有HTML都存在时,将触发DOM ready
事件。
PHP 不会干扰与DOM ready
,因为PHP是服务器端编码语言。它将从服务器进行处理,服务器发送请求的页面,然后您的broswer加载页面并激活DOM ready
事件。
DOM ready
和窗口load
之间的区别在于加载将等到每个图像/ css加载。标签存在于HTML中,但图像未显示。
基本上,我们可以说当浏览器读取HTML结束标记(</html>
)时会触发DOM就绪