document.readyState аналог для браузеров на основе геккона - PullRequest
5 голосов
/ 06 октября 2009

IE имеет атрибут readyState в объекте документа, который указывает текущее состояние, например, «загрузка», «завершение» и т. д.

Есть ли способ узнать текущее состояние загрузки документа в браузерах на базе Mozilla? Мне известно о событии DOMContentLoaded, но оно не подходит для моей ситуации, так как мой код может быть выполнен после того, как это событие было запущено.

Добавлено: нет, я не могу использовать какие-либо рамки и не путать с атрибутом .readyState объекта XHR. И это букмарклет, поэтому его можно вставить на любом этапе загрузки.

Добавлено позже: в любом случае, похоже, это не большая проблема для меня. Потому что этот атрибут будет добавлен в FF3.6 , и он не сломает вещи в Firefox, когда вы манипулируете на незаконченном DOM ( в отличие от IE ).

Ответы [ 2 ]

3 голосов
/ 07 октября 2009

Нет, это невозможно. Сожалею. Но вот что вы можете сделать. Если вы не можете проверить вещи, которые хотите посетить, прежде чем действовать:

window.setTimeout(function () {
    // do your stuff here
}, 0);

(Это определенно будет сделано после рендеринга страницы, но это может быть после загрузки, а не после DOMContentLoaded.)

Если вы знаете, как проверить то, что ищете:

(function () {
    if (/* test if what you're looking for is there */) {
        // do your stuff
    } else {
        window.setTimeout(arguments.callee, 0);
    }
})();

Это сделает это немедленно, если того, что вы ищете, там нет, и в этом случае оно будет ждать до окончания события onload.

Edit:

Проверьте это решение.

В крайних случаях он проверяет, является ли последний элемент document.getElementsByTagName ("*") неопределенным или нет. И это похоже на него, даже в Опере.

2 голосов
/ 06 октября 2009

Может быть выполнен? Просто получите уведомление о событии DOM и сохраните его состояние. Я не понимаю, в чем твоя коренная проблема. Конечно, вы можете вырвать кишки этого метода и адаптировать его к вашей ситуации.

Способ jQuery:

// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
    // Use the handy event callback
    document.addEventListener( "DOMContentLoaded", function(){
              //do stuff
    }, false );

// If IE event model is used
} else if ( document.attachEvent ) {
    // ensure firing before onload,
    // maybe late but safe also for iframes
    document.attachEvent("onreadystatechange", function(){
        if ( document.readyState === "complete" ) {
            document.detachEvent( "onreadystatechange", arguments.callee );
            jQuery.ready();
        }
    });

    // If IE and not an iframe
    // continually check to see if the document is ready
    if ( document.documentElement.doScroll && window == window.top ) (function(){
        if ( jQuery.isReady ) return;

        try {
            // If IE is used, use the trick by Diego Perini
            // http://javascript.nwbox.com/IEContentLoaded/
            document.documentElement.doScroll("left");
        } catch( error ) {
            setTimeout( arguments.callee, 0 );
            return;
        }

        // and execute any waiting functions
        jQuery.ready();
    })();
}

// A fallback to window.onload, that will always work
jQuery.event.add( window, "load", jQuery.ready );
...