2013-07-08 6 views
5

Комментарии от this question заставили меня задуматься. Когда срабатывает функция $(document).ready()? Очевидным ответом будет «когда документ готов», но когда это точно?

Например, if I turned output buffering on and flushed my output while PHP continued executing, не так ли отправить вывод в браузер? Итак, каким образом документ может быть готов до того, как скрипт PHP завершит выполнение, или событие подождало, пока запрос не будет завершен?


EDIT:

ответы, кажется, в основном согласны, что событие срабатывает, когда клиент думает, что он готов.

Чтобы получить лучшее понимание (что я должен, вероятно, сделали в первую очередь), я просто настроить тест:

<?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, казалось, автоматически исправит его, поместив эти теги в конце страницы (как показано в инспекторе веб-разработчиков). Просмотр источника страницы показал его посередине, где я его повторил.

+1

ready() всегда после того, как php будет распечатывать страницу html. другими словами, это всегда после отправки «». – dandavis

+8

«Готовое» событие является концепцией браузера. Браузер считает, что страница «готова», когда она обрабатывает содержимое '', и подготовила DOM, в то время как некоторые CSS и выборки изображений все еще могут быть отложены. Он не знает и не заботится о том, что делает сервер, в любом прямом смысле. – Pointy

+0

в соответствии с документацией, которую она запускает «вскоре после того, как иерархия DOM была полностью построена», но прежде, чем все действительно загрузится на страницу. Так что если у вас есть изображения, они могут быть запущены до того, как они будут загружены (поэтому jquery также предоставляет «load» – scrappedcola

ответ

5

JQuery в для костров документа, как только JQuery определяет, что DOM доступен. Точный механизм зависит от браузера.

Посмотрите на соответствующий source code.

Во-первых, существует проверка того, доступна ли DOM в точке, где была сделана попытка связать прослушиватель с событием. Если это так, ответные вызовы должны быть немедленно сработаны, хотя на самом деле они не являются , поэтому немедленно запустите, чтобы код уже занимал текущий слот выполнения, чтобы отменить обработчики, если это необходимо.

Если DOM еще не доступен, делается попытка связать прослушиватель событий с исходным кодом браузера DOMContentLoaded - это правильный «правильный» способ попросить браузер сообщить вам, когда DOM доступен, но это относительно современная функция. Если это не представляется возможным (это почти наверняка означает, что вы код работает в старой версии IE), код возвращается к нескольким механизмам:

  • Try и приложить к onreadystatechange событию документа. Это не безупречно и будет позже, чем DOMContentLoaded, но это очень хорошо.
  • Возврат к load события window объект. Это часто будет намного позже, чем DOM, но это последняя защита от сбоев, чтобы гарантировать, что событие всегда будет срабатывать в конечном итоге.
  • Худший сценарий: продолжайте опрос DOM, пока он не будет доступен.

С PHP точки зрения, это возможно (но маловероятно), для того чтобы это произошло, прежде чем ваш PHP скрипт завершит выполнение. Бывают ситуации (например, длительный опрос), где событие будет срабатывать до завершения вашего сценария, но это произойдет только в старых браузерах. Однако в этих сценариях вы не должны (не должны) использовать эти события вообще, вы просто разместите соответствующие <script> элементы в теле страницы, чтобы они могли быть выполнены, как только они будут загружены, без ожидая остальной части DOM.

Лично я никогда не использовал ни одно из этих событий с нагрузкой, более или менее по этой причине. YMMV.

0

Стреляет после иерархии по DOM была полностью построена и нет больше PHP кода для выполнения (как PHP-код выполняются до того, как страница будет отправлена).

Это означает, что он выполняется, как только страница будет получена клиентом. После этого могут загружаться другие вещи, такие как изображения, CSS и другой Javascript.

0

Document.ready() уволен, когда DOM сделан загрузка. Когда весь HTML присутствует, произойдет событие DOM ready.

PHP не будет мешать с DOM ready, поскольку PHP является языком кодирования на стороне сервера. Он будет завершен с сервера, сервер отправляет запрошенную страницу, затем ваш браузер загружает страницу и DOM ready.

Разница между DOM ready и окна load что нагрузка будет ждать до тех пор, пока загружается каждый изображение/CSS. Тег присутствует в HTML, но изображение не отображается.

Основном, мы могли бы сказать, что DOM готова обжигают, когда браузер считывает HTML закрывающего тега (</html>) ready события

3

Например, если я включил буферизацию вывода и сбросил свой вывод, а PHP продолжал выполнение, не отправил бы этот вывод в браузер?

Да, он отправил бы результат, но это не значит, что браузер считает, что сервер завершен. Я знаю, что это не PHP, но мне нравится статья Perl Suffering from Buffering. Документ готов, когда UserAgent считает, что он готов. Однако браузер будет держать сокет открытым, хотя он все еще считает, что он принимает данные, и никакой сигнал END не был отправлен.

Так может ли документ быть готов до завершения скрипта PHP, или событие ожидает завершения запроса?

Как правило, браузер будет ожидать окончания передачи данных сервером. Если вы очищаете выход, возможно, веб-сервер может зайти во время работы сценария, например, я думаю, что Apache имеет по умолчанию 2 минуты. Если сервер отправляет конечный сигнал, ваш документ завершен, и ваш браузер может подготовить DOM и запустить событие DOMReady, даже если ваш скрипт все еще работает на сервере.


В отличии от некоторых других комментариев </body> и </html> не являются хорошими индикаторами готовности DOM, в первую очередь потому, что страница может быть неправильно сформирована (есть орфографические ошибки или не включать эти конечные тег). В этих случаях браузер будет отображаться в Quirksmode и запускать DOMReady.

Смежные вопросы