Редактировать: С приближением 2018 года я думаю, что безопасно слушать DOMContentLoaded
.
function fireOnReady() { /* ... */ }
if (document.readyState === 'complete') {
fireOnReady();
} else {
document.addEventListener("DOMContentLoaded", fireOnReady);
}
Обратите внимание, что событие срабатывает только один раз при загрузке страницы! Если вам нужно поддерживать действительно старые браузеры, ознакомьтесь с очень легким скриптом, который я собрал ниже.
Только для исторической справки:
jQuery имеет недокументированное свойство isReady, которое используется для внутреннего использования, чтобы определить, сработало ли событие готовности DOM:
if($.isReady) {
// DOM is ready
} else {
// DOM is not yet ready
}
Я начал с 1.5.2, вернулся к 1.3.2, и свойство есть. Хотя это недокументировано, я бы сказал, что вы можете положиться на это свойство в будущих версиях jQuery. Редактировать: И год спустя - v1.7.2, они все еще используют $.isReady
- все еще недокументированный, поэтому, пожалуйста, используйте на свой страх и риск. Будьте осторожны при обновлении.
Изменить: версия 1.9, они все еще используют $.isReady
— все еще недокументированные
Изменить: версия 2.0 со всеми "основными" изменениями по-прежнему использует $.isReady
— все еще недокументированная
Редактировать: v3.x по-прежнему использует $.isReady
— все еще недокументированный
Редактировать: Как отметили несколько человек, приведенное выше на самом деле не отвечает на вопрос. Поэтому я только что создал мини-фрагмент, готовый к DOM, вдохновленный фрагмент еще меньшего размера, готовый к DOM. Дастин создал изящный способ проверки документа readyState примерно так:
if( !/in/.test(document.readyState) ) {
// document is ready
} else {
// document is NOT ready
}
Причина, по которой это работает, заключается в том, что браузер имеет 3 состояния загрузки: «загрузка», «интерактивный» и «завершенный» (старый WebKit также использовал «загружено», но вам больше не нужно об этом беспокоиться) эм>. Вы заметите, что и «загрузка», и «интерактив» содержат текст «in»… поэтому, если строка «in» находится внутри document.readyState
, значит, мы еще не готовы.
person
Ryan Wheale
schedule
13.06.2011
document.addEventListener('DOMContentLoaded' ...
, как предлагается ниже (почти скрыто), вместо библиотеки. - person Pierre H.   schedule 08.09.2017