Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect if DOMContentLoaded was fired

I'm trying to help developing a library and for it I'm trying to work with page loading.
In the process I want to make the library completely compatible with the use of defer and async.

What I want is simple:
How can I know that DOMContentLoaded was fired by the time the file is executed?

Why is this so difficult?
In IE, document.readyState show interactive before DOMContentLoaded.
I won't use browser detection in any way, it's against the policy of me and the rest of the participants.

What's the correct alternative?

Edit:

Seems like I wasn't clear enough. I'm not interested to know if the load event has already occurred!!! I already knew how to solve that problem! I want to know how to solve with DOMContentLoaded!!!

like image 500
brunoais Avatar asked Feb 26 '12 22:02

brunoais


People also ask

What happens after DOMContentLoaded?

What happens if we set the DOMContentLoaded handler after the document is loaded? Naturally, it never runs. There are cases when we are not sure whether the document is ready or not. We'd like our function to execute when the DOM is loaded, be it now or later.

What triggers DOMContentLoaded?

The DOMContentLoaded event fires when the initial HTML document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading.

Does DOMContentLoaded wait for CSS?

DOMContentLoaded doesn't wait for stylesheets to load provided that no scripts are placed after the stylesheet reference, <link rel="stylesheet"> . This is valid for all browsers supporting DOMContentLoaded.


1 Answers

For seeing if all resources in the page have been loaded:

if (document.readyState === "complete" || document.readyState === "loaded") {      // document is already ready to go } 

This has been supported in IE and webkit for a long time. It was added to Firefox in 3.6. Here's the spec. "loaded" is for older Safari browsers.

If you want to know when the page has been loaded and parsed, but all subresources have not yet been loaded (which is more akin to DOMContentLoaded), you can add the "interactive" value:

if (document.readyState === "complete"       || document.readyState === "loaded"       || document.readyState === "interactive") {      // document has at least been parsed } 

Beyond this, if you really just want to know when DOMContentLoaded has fired, then you'll have to install an event handler for that (before it fires) and set a flag when it fires.

This MDN documentation is also a really good read about understanding more about the DOM states.

like image 152
jfriend00 Avatar answered Sep 22 '22 11:09

jfriend00