Php $(document).ready()何时启动?

Php $(document).ready()何时启动?,php,javascript,jquery,events,Php,Javascript,Jquery,Events,我的评论引起了我的思考。$(document).ready()函数确切何时启动?显而易见的答案是“当文件准备就绪时”,但具体是什么时候 例如,这不会将输出发送到浏览器吗?那么,在PHP脚本完成执行之前,文档是否可以准备就绪,或者事件是否等待请求完成 编辑: 回答似乎基本上一致认为,当客户认为已经准备好时,事件就会触发 为了更好地理解(我本来应该这么做的),我只设置了一个测试: <?php ob_start(); ?> <html> <head> &l

我的评论引起了我的思考。
$(document).ready()函数确切何时启动?显而易见的答案是“当文件准备就绪时”,但具体是什么时候

例如,这不会将输出发送到浏览器吗?那么,在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>

$(文档).ready(函数(){
警惕(“准备就绪”);
});
结果是,在本例中,内容立即开始显示在页面上,但直到循环完成或脚本超时(30秒)后,警报才出现

根据您使用的浏览器,我尝试在循环中插入以下内容:

if ($i == 99) {
    echo "</body></html>";
}
if($i==99){
回声“;
}

Chrome似乎通过将这些标签放在页面的末尾(如web开发检查器中所示)来自动更正它。查看页面的源代码,在中间显示了它。在这里,

< P>根据jQuery站点,<代码> $(文档).Read()/Cuff>将只在页面文档对象模型(DOM)准备好执行JavaScript代码时运行。


参考:

它在DOM层次结构完全构建之后触发,并且没有更多的PHP代码可执行(因为PHP代码在发送页面之前执行)

这意味着一旦客户机接收到页面,它就会执行。之后可能会加载其他内容,例如图像、CSS和其他Javascript。

Document.ready()
在DOM加载完成时被激发。当所有HTML都存在时,将触发DOM
ready
事件

PHP不会干扰DOM
ready
,因为PHP是一种服务器端编码语言。它将从服务器处理,服务器发送请求的页面,然后broswer加载页面,DOM
ready
事件触发

DOM
ready
和window
load
之间的区别在于,load将等待每个图像/css被加载。该标记存在于HTML中,但未显示图像


基本上,我们可以说,当浏览器读取HTML结束标记(

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

请看相关的

首先,检查DOM是否已经在尝试将侦听器绑定到事件的位置可访问。如果是的话,回调将被安排立即启动——尽管它们实际上不会立即启动,以允许已经占用当前执行槽的代码在需要时取消处理程序

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

  • 尝试并附加到文档的
    onreadystatechange
    事件。这不是傻瓜式的,并且将比
    DOMContentLoaded
    更晚,但它非常好
  • 返回到
    窗口
    对象的
    加载
    事件。这通常比DOM可用的时间晚得多,但这是确保事件最终总是触发的最后一个安全措施
  • 最坏的情况是:继续轮询DOM,直到它可以访问为止
从PHP的角度来看,在PHP脚本完成执行之前发生这种情况是可能的(但不太可能)。在某些情况下(例如长轮询),事件会在脚本完成之前触发,但这只会发生在较旧的浏览器中。但是,在这些场景中,您根本不会(不应该)使用这些事件,只需在页面主体中放置适当的
元素,以便在加载后立即执行它们,而无需等待DOM的其余部分

就我个人而言,我从不使用这些负载驱动事件中的任何一个,或多或少都是出于这个原因。YMMV

例如,如果在PHP继续执行时打开输出缓冲并刷新输出,那么输出不会发送到浏览器吗

是的,它会发送输出,但这并不意味着浏览器认为服务器已经完成。我知道这不是PHP,但我喜欢这篇Perl文章。当UserAgent认为文档已准备就绪时,文档已准备就绪。但是,浏览器将保持套接字打开,同时仍然认为它正在接收数据,并且没有发送结束信号

那么,在PHP脚本完成执行之前,文档是否可以准备就绪,或者事件是否等待请求完成

通常,浏览器将等待服务器完成数据发送。如果刷新输出,则可能在脚本仍在运行时web服务器会超时,例如,我认为Apache的默认值为2分钟。如果服务器发送结束信号,则说明文档已完成,浏览器可能会准备DOM并触发DOMReady事件,即使脚本仍在服务器上运行


与其他一些注释相反,
不是DOM准备就绪的良好指示器,主要原因是页面可能格式错误(拼写错误或不包含这些错误)