$(document).ready()什么时候开火?

时间:2013-07-08 18:06:07

标签: php javascript jquery events

来自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开发检查器中所示)。查看页面的来源显示它在中间,我在那里回应它。

5 个答案:

答案 0 :(得分:6)

只要jQuery确定DOM可访问,就会触发jQuery的ready事件。确切的机制取决于浏览器。

查看相关的source code

首先,检查在尝试将侦听器绑定到事件时是否已经可以访问DOM。如果是,则调度回调计划立即启动 - 尽管它们实际上并未立即解雇,以允许已占用当前执行槽的代码在需要时取消处理程序。

如果DOM尚不可访问,则会尝试将事件侦听器绑定到浏览器的本机DOMContentLoaded事件 - 这是要求浏览器在DOM处于时通知您的“正确”本机方式可用,但它是一个相对现代的功能。如果这是不可能的(这几乎可以肯定地表明您的代码在旧版本的IE中运行),代码可以回溯到几种机制:

  • 尝试并附加到文档的onreadystatechange事件。这不是万无一失的,会比DOMContentLoaded更晚,但它还不错。
  • 回退到load对象的window事件。这通常比DOM可用的时间晚得多,但确保事件最终会终结,这是最后的失败保障。
  • 最糟糕的情况:继续轮询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)

加载完DOM后会触发

Document.ready()。当所有HTML都存在时,将触发DOM ready事件。

PHP 不会干扰与DOM ready,因为PHP是服务器端编码语言。它将从服务器进行处理,服务器发送请求的页面,然后您的broswer加载页面并激活DOM ready事件。

DOM ready和窗口load之间的区别在于加载将等到每个图像/ css加载。标签存在于HTML中,但图像未显示。

基本上,我们可以说当浏览器读取HTML结束标记(</html>)时会触发DOM就绪