AAA Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Обработчик загрузки DOM. (DOMContentLoaded)

Самый простой способ вызова, это onload, но проблема в том, что обработчик onload сработает, когда загрузится весь документ, все картинки и внешние объекты. И если объект находится на недоступном сервере, то onload может и не вызваться. При использовании готовых библиотек, это обычно обрабатывается вызовом $(document).ready. Если Вы не используете сторонние библиотеки и хотите это реализовать чистым Javascript, и при этом учесть кроссбраузерность(работу во всех браузерах), то вам пригодиться эта универсальная функция:

Исходный код этого примера:

<script language="JavaScript" type="text/javascript">
var funcDomReady='';

function onDomReady(func) { // функция добавления события
        var oldonload = funcDomReady;
        if (typeof funcDomReady != 'function')
                funcDomReady = func;
        else {
                funcDomReady = function() {
                        oldonload();
                        func();
                }
        }
}

// добавляем функцию, которую нужно вызвать после загрузки DOM
onDomReady(alert("DOM загружен! Обработчик 1"));
onDomReady(alert("DOM загружен! Обработчик 2"));

function init() {
    // выходим, если функция уже выполнялась
    if (arguments.callee.done) return;

    // устанавливаем флаг, чтобы функция не исполнялась дважды
    arguments.callee.done = true;

    if(funcDomReady)funcDomReady();	// вызываем всю цепочку обработчиков
};

/* для Mozilla/Firefox/Opera 9 */
if (document.addEventListener)
    document.addEventListener("DOMContentLoaded", init, false);

/* для Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
document.write("<script id=\"__ie_onload\" defer=\"defer\" src=\"javascript:void(0)\"><\/script>");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
    if (this.readyState == "complete")
	init();}; // вызываем обработчик для onload
/*@end @*/

/* для Safari */
if (/WebKit/i.test(navigator.userAgent)) { // условие для Safari
    var _timer = setInterval(function() {
	if (/loaded|complete/.test(document.readyState)) {
	    clearInterval(_timer);
	    init(); // вызываем обработчик для onload
	}
    }, 10);
}

/* для остальных браузеров */
window.onload = init;
</script>

Функцию можно смело вынести во внешний script-файл.

И на закуску красивоек простое решение:

function ready(cb) {
    /in/.test(document.readyState) ? setTimeout(ready.bind(null, cb), 9) : cb();
}
ready(function(){ console.log("The DOM is ready"); });

.

© Copyright 2008-2016 by KDG