Кросс-браузер Dom Ready - PullRequest
       19

Кросс-браузер Dom Ready

20 голосов
/ 01 августа 2011

Я унаследовал этот фрагмент кода, и он кажется неоптимальным и, возможно, неправильным, поскольку он добавляет прослушиватели событий как для объектов окна, так и для объектов документа. Тем не менее, он работает правильно, за исключением Blackberry 5.0. Может кто-нибудь объяснить, правильно ли все это настроено или есть какие-то рекомендации, чтобы сделать его лучше и / или более оптимизированным?

        if (document.readyState === "complete") 
            callback();
        else if (document.addEventListener) 
        {
            document.addEventListener("DOMContentLoaded",callback,false);
            window.addEventListener("load",callback,false);
        }
        else if(window.attachEvent) 
        {
            document.attachEvent("onreadystatechange", callback);
            window.attachEvent("onLoad",callback);
        } else
            setTimeout(callback,2000);

Ответы [ 3 ]

62 голосов
/ 01 августа 2011

Если вы хотите узнать, как это делается, или увидеть способ сделать это.Я рекомендую посмотреть на работу Диего Перини.Его работы и методы используются во многих библиотеках DOM, включая jQuery.Парень, кажется, не получает большой кредит, к сожалению.Он - тот, кто впервые применил метод опроса try / catch, который делает возможными кроссбраузерные события, когда dom загружается в микс.

5 голосов
/ 01 августа 2011

Если вы хотите использовать чистый JavaScript, вы можете использовать следующую кросс-браузерную функцию (источник (на русском языке): http://javascript.ru/unsorted/top-10-functions)

function bindReady(handler){
    var called = false     
    function ready() {
        if (called) return
        called = true
        handler()
    }     
    if ( document.addEventListener ) {
        document.addEventListener( "DOMContentLoaded", function(){
            ready()
        }, false )
    } else if ( document.attachEvent ) { 
        if ( document.documentElement.doScroll && window == window.top ) {
            function tryScroll(){
                if (called) return
                if (!document.body) return
                try {
                    document.documentElement.doScroll("left")
                    ready()
                } catch(e) {
                    setTimeout(tryScroll, 0)
                }
            }
            tryScroll()
        }
        document.attachEvent("onreadystatechange", function(){     
            if ( document.readyState === "complete" ) {
                ready()
            }
        })
    }
    if (window.addEventListener)
        window.addEventListener('load', ready, false)
    else if (window.attachEvent)
        window.attachEvent('onload', ready)
    /*  else  // use this 'else' statement for very old browsers :)
        window.onload=ready
    */
}
readyList = []      
function onReady(handler) {  
    if (!readyList.length) { 
        bindReady(function() { 
            for(var i=0; i<readyList.length; i++) { 
                readyList[i]() 
            } 
        }) 
    }   
    readyList.push(handler) 
}

Использование:

onReady(function() {
  // ... 
})
3 голосов
/ 01 августа 2011

Лично я бы использовал для этого jQuery .

jQuery разработан для обработки различных браузерских реализаций состояния готовности документа.код выше будет выглядеть так:

$(callback);
...