Is innerHTML asynchronous?

Setting innerHTML is synchronous, as are most changes you can make to the DOM. However, rendering the webpage is a different story.

(Remember, DOM stands for “Document Object Model”. It’s just a “model”, a representation of data. What the user sees on their screen is a picture of how that model should look. So, changing the model doesn’t instantaneously change the picture – it take some time to update.)

Running JavaScript and rendering the webpage actually happen separately. To put it simplistically, first all of the JavaScript on the page runs (from the event loop – check out this excellent video for more detail) and then after that the browser renders any changes to the webpage for the user to see. This is why “blocking” is such a big deal – running computationally intensive code prevents the browser from getting past the “run JS” step and into the “render the page” step, causing the page to freeze or stutter.

Chrome’s pipeline looks like this:

enter image description here

As you can see, all of the JavaScript happens first. Then the page gets styled, laid out, painted, and composited – the “render”. Not all of this pipeline will execute every frame. It depends on what page elements changed, if any, and how they need to be rerendered.

Note: alert() is also synchronous and executes during the JavaScript step, which is why the alert dialog appears before you see changes to the webpage.

You might now ask “Hold on, what exactly gets run in that ‘JavaScript’ step in the pipeline? Does all my code run 60 times per second?” The answer is “no”, and it goes back to how the JS event loop works. JS code only runs if it’s in the stack – from things like event listeners, timeouts, whatever. See previous video (really).

https://developers.google.com/web/fundamentals/performance/rendering/

Leave a Comment