php - $(document).ready() 什么时候触发?

标签 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 似乎通过将这些标记放在页面末尾来自动更正它(如在网络开发检查器中所见)。查看页面的源代码显示它在中间,不过我在那里回显了它。

最佳答案

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

看看相关的source code .

首先,在尝试将监听器绑定(bind)到事件时,会检查 DOM 是否已经可以访问。如果是,回调将被安排立即触发 - 尽管它们实际上并未立即触发,以允许已经占用当前执行槽的代码在需要时取消处理程序。

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

  • 尝试附加到 onreadystatechange文档的事件。这不是万无一失的,会晚于 DOMContentLoaded本来可以的,但是已经很不错了。
  • 回到load window 事件目的。这通常比 DOM 可用要晚得多,但这是确保事件最终始终会触发的最后一道防故障措施。
  • 最坏的情况:继续轮询 DOM 直到它可以访问。

从 PHP 的 Angular 来看,这可能(但不太可能)在您的 PHP 脚本执行完毕之前发生。在某些情况下(例如长轮询)事件会在脚本完成之前触发,但这只会发生在较旧的浏览器中。但是,在这些情况下,您根本不会(不应该)使用这些事件,您只需放置适当的 <script> 即可。页面主体中的元素允许它们在加载后立即执行,而无需等待 DOM 的其余部分。

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

关于php - $(document).ready() 什么时候触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533150/

相关文章:

jquery - 使用 jquery 选择一系列 td 单元格

java - 通过 Nexmo API 将回调 URL 分配给短信号码

javascript - 提交前预览

javascript/jquery在多维json对象中查找id号,并使用id号所在的对象本身作为对象

javascript - 如何在 if else 语句中使用 jquery css ('display' , 'block' ) 和 css ('display' , 'none' )

javascript - "Score"变量没有改变

javascript - 如何无限循环项目列表?

php - 多个应用程序访问相同的数据

php - 是否可以使用较少的代码从值列中为 PHP 中的数组元素分配键?

php - 如何在 Eloquent ORM Laravel 上添加多个 where 子句?