Javascript domready?
Я знаю, что могу использовать разные структуры, такие как прототип или jquery, для присоединения функции к window.onload, но не того, что я ищу.
Мне нужно что-то вроде .readyState, чтобы я мог сделать что-то вроде этого:
if(document.isReady){
var id = document.getElem ...
}
есть ли другой способ, чем использовать то, что делают фреймворки?
Ответы
Ответ 1
Я обновил код DOMAssistant library, он отлично работает со мной
var domReady = (function (){
var arrDomReadyCallBacks = [] ;
function excuteDomReadyCallBacks(){
for (var i=0; i < arrDomReadyCallBacks.length; i++) {
arrDomReadyCallBacks[i]();
}
arrDomReadyCallBacks = [] ;
}
return function (callback){
arrDomReadyCallBacks.push(callback);
/* Mozilla, Chrome, Opera */
if (document.addEventListener ) {
document.addEventListener('DOMContentLoaded', excuteDomReadyCallBacks, false);
}
/* Safari, iCab, Konqueror */
if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) {
browserTypeSet = true ;
var DOMLoadTimer = setInterval(function () {
if (/loaded|complete/i.test(document.readyState)) {
//callback();
excuteDomReadyCallBacks();
clearInterval(DOMLoadTimer);
}
}, 10);
}
/* Other web browsers */
window.onload = excuteDomReadyCallBacks;
}
})()
Ответ 2
Изменить: По мере того, как наступит год 2018 года, я думаю, что можно спокойно слушать DOMContentLoaded
событие.
function fireOnReady() { /* ... */ }
if (document.readyState === 'complete') {
fireOnReady();
} else {
document.addEventListener("DOMContentLoaded", fireOnReady);
}
Обратите внимание, что при загрузке страницы событие будет срабатывать только один раз. Если вам нужно поддерживать действительно старые браузеры, тогда ознакомьтесь с супер легким script, который я собрал ниже.
Только для справки по истории:
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 готовый фрагмент, который был вдохновлен Дастином Диасом еще меньше готового фрагмента DOM. Дастин создал аккуратный способ проверить документ readyState с чем-то похожим на это:
if( !/in/.test(document.readyState) ) {
// document is ready
} else {
// document is NOT ready
}
Причина этого в том, что браузер имеет 3 состояния загрузки: "загрузка", "интерактивная" и "полная" (более старый WebKit также используется "загружен", но вам больше не нужно об этом беспокоиться), Вы заметите, что как "загрузка", так и "интерактивная" содержат текст "in"... поэтому, если строка "in" находится внутри document.readyState
, то мы знаем, что мы еще не готовы.
Ответ 3
Хотя я обычно выступаю за то, чтобы избегать использования фреймворков, если это необходимо, я бы сказал, что использование одного в этом случае совершенно нормально. Здесь jQuery:
$(function () {
// do stuff after DOM has loaded
});
Обратите внимание, что это НЕ то же самое, что и событие window.onload
, так как onload
выполняется сначала после загрузки других ресурсов (изображения и т.д.). Код, который я использовал в моем примере, будет выполняться, когда DOM закончит загрузку, т.е. когда доступна полная структура HTML (необязательно, когда доступны изображения, CSS и т.д.)
Если вы хотите проверочную переменную, вы можете установить ее в готовой функции:
var documentIsReady = false;
$(function () { documentIsReady = true; });
Конечно, вы можете найти еще более легкие библиотеки, чем jQuery, если все, что вы хотите сделать, это проверить наличие DOM-ready. Но используйте библиотеку в случаях, когда разные браузеры ведут себя по-разному (это один такой случай.)
Использование некоторого кода из библиотеки DOMAssistant, чтобы ваша собственная функция "DOM ready" не была слишком сложной:
var domLoaded = function (callback) {
/* Internet Explorer */
/*@cc_on
@if (@_win32 || @_win64)
document.write('<script id="ieScriptLoad" defer src="//:"><\/script>');
document.getElementById('ieScriptLoad').onreadystatechange = function() {
if (this.readyState == 'complete') {
callback();
}
};
@end @*/
/* Mozilla, Chrome, Opera */
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', callback, false);
}
/* Safari, iCab, Konqueror */
if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) {
var DOMLoadTimer = setInterval(function () {
if (/loaded|complete/i.test(document.readyState)) {
callback();
clearInterval(DOMLoadTimer);
}
}, 10);
}
/* Other web browsers */
window.onload = callback;
};
Не тестировалось, но оно должно работать. Я упростил его с DOMAssistant, потому что DOMAssistant допускает множественные обратные вызовы и проверяет, чтобы вы не могли добавить одну и ту же функцию дважды и т.д.
Ответ 4
За 5 лет, прошедших с момента запроса этого вопроса, DOMContentLoaded стал универсально поддерживаемым событием, и вы можете просто использовать его.
document.addEventListener('DOMContentLoaded', function() {
//.. do stuff ..
}, false);
Ответ 5
Проверьте эту демонстрацию от Microsoft. → http://ie.microsoft.com/testdrive/HTML5/DOMContentLoaded/Default.html
И вот суть кода, который позволяет вам запускать JS на DOM...
(function () {
function load2(){
// put whatever you need to load on DOM ready in here
document.getElementById("but3").addEventListener("click", doMore, false);
}
if (window.addEventListener) {
window.addEventListener('DOMContentLoaded', load2, false);
} else {
window.attachEvent('onload', load2);
}
} ());
Вот некоторые из источников javascript для демонстрации.
http://ie.microsoft.com/testdrive/Includes/Script/ReturnAndShareControls.js
Это хорошо работает. Ницца!!.. на Google Chrome и IE 9.
Ответ 6
document.addEventListener("DOMContentLoaded", function(e){
console.log("dom ready");//output to web browser console
});
для этого не нужен JQuery. Нет необходимости передавать 3-й параметр в DOMContentLoaded, так как это событие не имеет родителя для прохождения события. Также не нужно задумываться о том, что говорят все остальные. Это скажет вам, когда DOM будет полностью загружен и готов к использованию. Я LOLED, когда я заметил DOM помощник lib. Эта библиотека абсолютно бесполезна.
Событие DOMContentLoaded запускается, когда документ полностью загружен и проанализирован, не дожидаясь, пока закончите загрузку таблиц стилей, изображений и подкадров.
addEventListener()
- отличная функция для проверки любого события, включая статус готовности DOM. При использовании "DOMContentLoaded" третий параметр в addEventListener()
не требуется, поскольку этот триггер не имеет родительского элемента, чтобы передать событие тоже. В приведенном выше примере вы заметите, что второй параметр является анонимной функцией. Вы также можете передать имя функции во второй параметр.
document.addEventListener([(string)event trigger], [function],[(boolean)traverse DOM tree]);
Еще одно преимущество использования этого в JQuery - это не будет нарушено при обновлении JQuery.
Ответ 7
jQuery не использует window.onload
.
$(document).ready()
ожидает, пока DOM загрузится и может быть пройден (остальная часть содержимого может быть загружена или не может быть загружена этой точкой).
Если вы потянете источник jQuery и выполните сортировку через беспорядок, вы обнаружите, что работа выполняется с помощью метода bindReady()
, который имеет несколько различных реализаций для разных браузеров и только тогда, когда все эти реализации не сработают, он падает назад при прослушивании события загрузки для окна.
Ответ 8
Это на самом деле одна из самых больших причин, по которой большинство людей используют фреймворки, такие как jQuery, потому что решение этого несовместимо в разных браузерах.
Ответ 9
Попробуйте следующее:
Ссылка: onDomReady в GitHub
или источник ниже:
if(document.ondomready == undefined) {
document.ondomready = {};
document.ondomready = null;
} else {
document.ondomready=document.ondomready;
}
var oldonload=document.onload;
var isLaunched = 0;
document.onload = function() {
if(oldonload !== null) {
oldonload.call();
}
};
document.addEventListener("DOMContentLoaded", function onDom(evt) {
var olddomready = document.ondomready;
if(olddomready !== null) {
if(isLaunched == 0) {
olddomready.call(evt);
isLaunched == 1;
//We now launched the mapped DOMContentLoaded Event
} else {
//We already launched DOMContentLoaded Event
}
}
}, false);
Я уже тестировал это на Opera 11.x/12.x. Еще не проверен на других. Дайте мне знать, если они это сделают.
Примечание: Я еще не загрузил репозиторий, но скоро буду в свободное время.
Ответ 10
Если вы хотите, чтобы меньшие библиотеки, которые занимались только конкретными вещами, вы могли использовать libs в microjs. Для рассматриваемого вопроса может быть использован метод DOMStatic libs ready.