Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

document.readyState analog for gecko-based browsers

Tags:

IE has attribute readyState in document object, that indicates current state, e.g. "loading", "complete" etc.

Is there any way to find current loading state of document in Mozilla-based browsers? I'm aware of DOMContentLoaded event, but it wont fit my situation, as my code can be executed after this event was fired.

Added: no, I can't use any framework, and don't confuse with .readyState attribute of XHR object. And it's a bookmarklet, so it can be inserted in at any loading stage.

Added later: Anyway, it looks like it's not a big issue for me. Because this attribute will be added in FF3.6, and it does not break things badly in Firefox, when you manipulate on unfinished DOM (unlike IE).

like image 794
maniac Avatar asked Oct 06 '09 16:10

maniac


People also ask

What does document readyState mean?

The readyState of a document can be one of following: loading. The document is still loading. interactive. The document has finished loading and the document has been parsed but sub-resources such as scripts, images, stylesheets and frames are still loading.


2 Answers

No, it's not possible. Sorry. But here's what you can do. If you can't test for stuff you want to be there before acting:

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

(This will definitely do it after the page renders, but it might be after onload, not after DOMContentLoaded.)

If you do know how to test for what you're looking for:

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

This will do it immediately, unless whatever you're looking for is not there, in which case it will wait until after the onload event.

Edit:

Check out this solution.

What it does is, in the edge cases, checks if the last element of document.getElementsByTagName("*") is undefined or not. And that seems to work for him, even in Opera.

like image 53
Anthony Mills Avatar answered Oct 02 '22 12:10

Anthony Mills


Can be executed? Just be notified of the DOM event and store its state. I don't see what your root problem is. Surely you could rip out the guts of this method and adapt it to your situation.

jQuery's way of doing it:

// 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 );
like image 32
Stefan Kendall Avatar answered Oct 02 '22 11:10

Stefan Kendall