Шрифт:
Пример 17.1. Вызов функций, когда документ будет готов к выполнению операций
/*
* Передайте функции whenReady свою функцию, и она вызовет ее (как метод
* объекта документа), как только завершится синтаксический анализ документа
* и он будет готов к выполнению операций. Зарегистрированные функции
* вызываются при первом же событии DOMContentLoaded, readystatechange или load.
* Как только документ станет готов и будут вызваны все функции,
* whenReady немедленно вызовет все функции, которые были ей переданы.
*/
var whenReady = (function { // Эта функция возвращается функцией whenReady
var funcs = []; // Функции, которые должны вызываться по событию
var ready = false; // Получит значение true при вызове функции handler
// Обработчик событий, который вызывается, как только документ
// будет готов к выполнению операций
function handler(e) {
// Если обработчик уже вызывался, просто вернуть управление
if (ready) return;
// Если это событие readystatechange и состояние получило значение,
// отличное от "complete", значит, документ пока не готов
if (e.type==="readystatechange" && document.readyState !== "complete") return;
// Вызвать все зарегистрированные функции.
// Обратите внимание, что здесь каждый раз проверяется значение
// свойства funcs.length, на случай если одна из вызванных функций
// зарегистрирует дополнительные функции.
for(var і = 0; і < funcs.length; i++) funcs[і].call(document);
// Теперь можно установить флаг ready в значение true и забыть
// о зарегистрированных функциях
ready = true;
funcs = null;
}
// Зарегистрировать обработчик handler для всех ожидаемых событий
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", handler, false);
document.addEventListener("readystatechange", handler, false);
window.addEventListener("load", handler, false);
}
else if (document.attachEvent) {
document.attachEvent("onreadystatechange", handler);
window.attachEvent("onload”, handler);
}
// Вернуть функцию whenReady
return function whenReady(f) {
if (ready)
f.call(document); // Вызвать функцию, если документ готов
else
funcs.push(f); // Иначе добавить ее в очередь,
} // чтобы вызвать позже.
});