Reputation: 115
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).
Upvotes: 4
Views: 4981
Reputation: 8784
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:
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.
Upvotes: 2
Reputation: 67892
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 );
Upvotes: 1