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开发人员检查器中所示)。查看页面的源代码将其显示在中间,尽管我在其中回显了它。
最佳答案
jQuery确定可访问DOM时,将触发该文档的jQuery的ready
事件。确切的机制取决于浏览器。
看一下相关的source code。
首先,检查试图在将监听器绑定(bind)到事件的点上是否已经可以访问DOM。如果是,则将回调计划为立即触发-尽管实际上并不会立即触发,以允许已占用当前执行插槽的代码在需要时取消处理程序。
如果尚无法访问DOM,则尝试将事件监听器绑定(bind)到浏览器的 native DOMContentLoaded
事件-这是要求浏览器在DOM可用时通知您的“正确” native 方式,但这是一种相对较现代的方法特征。如果这是不可能的(这几乎可以肯定表明您的代码正在IE的较旧版本中运行),则代码可归结为以下两种机制:
onreadystatechange
事件。这不是万无一失的,并且会比DOMContentLoaded
还要晚,但这是非常好的。 load
对象的window
事件。这通常要比DOM可用的时间晚很多,但这是最后的故障保护机制,以确保事件始终会最终触发。 从PHP的 Angular 来看,这有可能(但不太可能)在您的PHP脚本完成执行之前发生。在某些情况下(例如长轮询),该事件会在脚本完成之前触发,但这只会在较旧的浏览器中发生。但是,在这些情况下,您根本不会使用这些事件,只需将适当的
<script>
元素放置在页面的主体中,以允许它们在加载后立即执行,而无需等待DOM的其余部分。就我个人而言,出于这个原因,我从不使用这些负载驱动的事件中的任何一个。 YMMV。