In JavaScript, when I want to run a script once when the page has loaded, should I use window.onload
or just write the script?
For example, if I want to have a pop-up, should I write (directly inside the <script>
tag):
alert("hello!");
Or:
window.onload = function() {
alert("hello!");
}
Both appear to run just after the page is loaded. What is the the difference?
The other answers all seem out of date
First off, putting scripts at the top and using
window.onload
is an anti-pattern. It's left over from IE days at best or mis-understandings of JavaScript and the browser at worst.You can just move your scripts the the bottom of your html
The only reason people used
window.onload
is because they mistakenly believed scripts needed to go in thehead
section. Because things are executed in order if your script was in the head section then the body and your content didn't yet exist by definition of execute in order.The hacky workaround was to use
window.onload
to wait for the rest of the page to load. Moving your script to the bottom also solved that issue and now there's no need to usewindow.onload
since your body and content will have already been loaded.The more modern solution is to use the
defer
tag on your scripts but to use that your scripts need to all be external.This has the advantage that the browser will start downloading the scripts immediately and it will execute them in the order specified but it will wait to execute them until after the page has loaded, no need for
window.onload
or the better but still unneededwindow.addEventListener('load', ...
Here's the documentation on MDN.
According to it:
Your first snippet of code will run as soon as browser hit this spot in HTML.
The second snippet will trigger popup when the DOM and all images are fully loaded (see the specs).
Considering the
alert()
function, it doesn't really matter at which point it will run (it doesn't depend on anything besideswindow
object). But if you want to manipulate the DOM - you should definitely wait for it to properly load.That depends on if you want it to run when the script element is encountered or if you want it to run when the load event fires (which is after the entire document (including such things as images) has loaded).
Neither is always right.
In general, however, I'd avoid assigning functions directly to
onload
in favour of usingaddEventListener
(with compatibility libraries if I needed to support older browsers).You have three alternatives:
Directly inside the script tag runs it as soon as it is parsed.
Inside
document.addEventListener( "DOMContentLoaded", function(){});
will run it once the DOM is ready.Inside
window.onload function(){})
will run as soon as all page resources are loaded.The reason for waiting for the DOM to be loaded is so that you can target any elements that load after your script. If you're just creating an
alert
, it doesn't matter. Let's say, however, you were targeting adiv
that was in your markup after your script, you would get an error if you don't wait until that piece of the DOM tree to load.document.ready
is a great alternative towindow.onload
if you're using jQuery.See here: window.onload vs $(document).ready()
The first one just runs when the browser gets to it.
The second one waits for the window to be loaded before running it.
In general you should do the second, but you should attach an event listener to it instead of defining the function. For example: