Редактировать: Поскольку наступает 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
- все еще без документов, поэтому, пожалуйста, используйте на свой страх и риск. Будьте осторожны при обновлении.
Редактировать: v1.9, они все еще используют $.isReady
- все еще без документов
Редактировать: v2.0, со всеми его "основными" изменениями, по-прежнему используется $.isReady
- все еще без документов
Редактировать: v3.x все еще использует $.isReady
- все еще без документов
Редактировать: Как указали несколько человек, вышеизложенное на самом деле не отвечает на вопрос. Итак, я только что создал мини-готовый фрагмент DOM , который был вдохновлен Dustin Diaz еще меньшим готовым фрагментом DOM . Дастин создал удобный способ проверки документа readyState с помощью чего-то похожего на это:
if( !/in/.test(document.readyState) ) {
// document is ready
} else {
// document is NOT ready
}
Причина, по которой это работает, заключается в том, что браузер имеет 3 состояния загрузки: «загрузка», «интерактивный» и «полный» (более старый WebKit также использовал «загружен», но вам не нужно беспокоиться об этом больше) . Вы заметите, что и «загрузка», и «интерактивный» содержат текст «в» ... поэтому, если строка «в» находится внутри document.readyState
, то мы знаем, что мы еще не готовы.