Поскольку событие window.onload должно выполняться после загрузки всего содержимого страницы (включая изображения и т. д.), мы часто предпочитаем выполнять скрипт сразу после загрузки DOM. Фактически, большинство основных браузеров (Firefox 3+, Opera 9+, Safari 3+, Chrome 2+) предоставляют этот метод события: addDOMLoadEvent.
document.addEventListener("DOMContentLoaded", init, false);
Итак, как нам смоделировать событие addDOMLoadEvent для IE?
Матиас Миллер первым предложил следующее решение:
// для Internet Explorer (с использованием условных комментариев)
/*@cc_on @*/
/*@if (@_win32)
document.write("");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = функция() {
if (this.readyState == "завершено") {
init(); // вызываем обработчик загрузки
}
};
/*@конец @*/
Позже Диего Перини предложил решение, которое использует метод doScroll() для имитации события addDOMLoadEvent, и это решение в основном применяется в основных средах JavaScript (JQuery, YUI и т. д.).
Принцип в основном следующий:
Когда срабатывает событие ondocumentready, документ (документ) полностью проанализирован и создан. Если компоненту необходимо манипулировать исходной структурой документа, после этого необходимо разместить код инициализации. Событие ondocumentready сообщает компоненту, что вся страница загружена, и запускается непосредственно перед запуском события загрузки исходного документа.
Некоторые методы, такие как doScroll, требуют полной загрузки исходного документа. Если эти методы являются частью функции инициализации, они будут выполнены при возникновении события ondocumentready.
/*
*
*IEContentLoaded.js
*
* Автор: Диего Перини (diego.perini на gmail.com) NWBOX Srl
* Краткое описание: эмуляция DOMContentLoaded для браузеров IE.
* Обновлено: 10.05.2007.
* Лицензия: GPL/CC.
* Версия: подлежит уточнению
*
*/
// @w ссылка на окно
// @фн
функция referencefunction IEContentLoaded (w, fn) {
вар d = w.document, сделано = ложь,
// срабатывает только один раз
инициализация = функция () {
если (!сделано) {
сделано = правда;
ФН();
}
};
// опрос на отсутствие ошибок
(функция () {
пытаться {
// выдает ошибки до тех пор, пока не будет готов документ
d.documentElement.doScroll('слева');
} поймать (е) {
setTimeout(arguments.callee, 50);
возвращаться;
}
// ошибок нет, огонь
инициализация();
})();
// пытаемся всегда запускать перед загрузкой
d.onreadystatechange = функция() {
if (d.readyState == 'complete') {
d.onreadystatechange = ноль;
инициализация();
}
};
}