Когда работает $ (document) .ready ()?

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

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

Solutions Collecting From Web of "Когда работает $ (document) .ready ()?"

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

Взгляните на соответствующий исходный код .

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

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

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

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

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

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

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

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

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


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

Согласно сайту jQuery, $( document ).ready() будет запускаться только после того, как страница Document Object Model (DOM) готова для выполнения кода JavaScript.

Ссылка: http://learn.jquery.com/using-jquery-core/document-ready/

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

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

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

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

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

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