Which is more widely supported: window.onload
or document.onload
?
javascript – window.onload vs document.onload
The Question :
- MDN docs explains these
window
events:onload
andDOMContentLoaded
. Usage example:,window.addEventListener('DOMContentLoaded', callback)
. As of mid 2019, compatible with all major browsers. —– developer.mozilla.org/en-US/docs/Web/API/Window/… —— developer.mozilla.org/en-US/docs/Web/API/Window/load_event - For me even still, in Firefox 75.0 today,
window.onload
anddocument.onload
are different from each other!window.onload
seems to take place afterwards and has a bit more loaded thandocument.onload
! (Some things are working with window that aren’t working with document! That goes for document.onreadstatechange ‘complete’ as well!)
The Answer 1
When do they fire?
- By default, it is fired when the entire page loads, including its content (images, CSS, scripts, etc.).
In some browsers it now takes over the role of document.onload
and fires when the DOM is ready as well.
document.onload
- It is called when the DOM is ready which can be prior to images and other external content is loaded.
How well are they supported?
window.onload
appears to be the most widely supported. In fact, some of the most modern browsers have in a sense replaced document.onload
with window.onload
.
Browser support issues are most likely the reason why many people are starting to use libraries such as jQuery to handle the checking for the document being ready, like so:
$(document).ready(function() { /* code here */ }); $(function() { /* code here */ });
For the purpose of history. window.onload
vs body.onload
:
A similar question was asked on codingforums a while back regarding the usage of
window.onload
overbody.onload
. The result seemed to be that you should usewindow.onload
because it is good to separate your structure from the action.
The Answer 2
The general idea is that window.onload fires when the document’s window is ready for presentation and document.onload fires when the DOM tree (built from the markup code within the document) is completed.
Ideally, subscribing to DOM-tree events, allows offscreen-manipulations through Javascript, incurring almost no CPU load. Contrarily, window.onload
can take a while to fire, when multiple external resources have yet to be requested, parsed and loaded.
►Test scenario:
To observe the difference and how your browser of choice implements the aforementioned event handlers, simply insert the following code within your document’s – <body>
– tag.
<script language="javascript"> window.tdiff = []; fred = function(a,b){return a-b;}; window.document.onload = function(e){ console.log("document.onload", e, Date.now() ,window.tdiff, (window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) ); } window.onload = function(e){ console.log("window.onload", e, Date.now() ,window.tdiff, (window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) ); } </script>
►Result:
Here is the resulting behavior, observable for Chrome v20 (and probably most current browsers).
- No
document.onload
event. onload
fires twice when declared inside the<body>
, once when declared inside the<head>
(where the event then acts asdocument.onload
).- counting and acting dependent on the state of the counter allows to emulate both event behaviors.
- Alternatively declare the
window.onload
event handler within the confines of the HTML-<head>
element.
►Example Project:
The code above is taken from this project’s codebase (index.html
and keyboarder.js
).
For a list of event handlers of the window object, please refer to the MDN documentation.
The Answer 3
Add Event Listener
<script type="text/javascript"> document.addEventListener("DOMContentLoaded", function(event) { // - Code to execute when all DOM content is loaded. // - including fonts, images, etc. }); </script>
Update March 2017
1 Vanilla JavaScript
window.addEventListener('load', function() { console.log('All assets are loaded') })
2 jQuery
$(window).on('load', function() { console.log('All assets are loaded') })
Good Luck.
The Answer 4
According to Parsing HTML documents – The end,
The browser parses the HTML source and runs deferred scripts.
A
DOMContentLoaded
is dispatched at thedocument
when all the HTML has been parsed and have run. The event bubbles to thewindow
.The browser loads resources (like images) that delay the load event.
A
load
event is dispatched at thewindow
.
Therefore, the order of execution will be
DOMContentLoaded
event listeners ofwindow
in the capture phaseDOMContentLoaded
event listeners ofdocument
DOMContentLoaded
event listeners ofwindow
in the bubble phaseload
event listeners (includingonload
event handler) ofwindow
A bubble load
event listener (including onload
event handler) in document
should never be invoked. Only capture load
listeners might be invoked, but due to the load of a sub-resource like a stylesheet, not due to the load of the document itself.
window.addEventListener('DOMContentLoaded', function() { console.log('window - DOMContentLoaded - capture'); // 1st }, true); document.addEventListener('DOMContentLoaded', function() { console.log('document - DOMContentLoaded - capture'); // 2nd }, true); document.addEventListener('DOMContentLoaded', function() { console.log('document - DOMContentLoaded - bubble'); // 2nd }); window.addEventListener('DOMContentLoaded', function() { console.log('window - DOMContentLoaded - bubble'); // 3rd }); window.addEventListener('load', function() { console.log('window - load - capture'); // 4th }, true); document.addEventListener('load', function(e) { /* Filter out load events not related to the document */ if(['style','script'].indexOf(e.target.tagName.toLowerCase()) < 0) console.log('document - load - capture'); // DOES NOT HAPPEN }, true); document.addEventListener('load', function() { console.log('document - load - bubble'); // DOES NOT HAPPEN }); window.addEventListener('load', function() { console.log('window - load - bubble'); // 4th }); window.onload = function() { console.log('window - onload'); // 4th }; document.onload = function() { console.log('document - onload'); // DOES NOT HAPPEN };
The Answer 5
In Chrome, window.onload is different from <body onload="">
, whereas they are the same in both Firefox(version 35.0) and IE (version 11).
You could explore that by the following snippet:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!--import css here--> <!--import js scripts here--> <script language="javascript"> function bodyOnloadHandler() { console.log("body onload"); } window.onload = function(e) { console.log("window loaded"); }; </script> </head> <body onload="bodyOnloadHandler()"> Page contents go here. </body> </html>
And you will see both “window loaded”(which comes firstly) and “body onload” in Chrome console. However, you will see just “body onload” in Firefox and IE. If you run “window.onload.toString()
” in the consoles of IE & FF, you will see:
“function onload(event) { bodyOnloadHandler() }”
which means that the assignment “window.onload = function(e)…” is overwritten.
The Answer 6
window.onload
and onunload
are shortcuts to document.body.onload
and document.body.onunload
document.onload
and onload
handler on all html tag seems to be reserved however never triggered
‘onload
‘ in document -> true
The Answer 7
window.onload however they are often the same thing. Similarly body.onload becomes window.onload in IE.
The Answer 8
Window.onload is the standard, however – the web browser in the PS3 (based on Netfront) doesn’t support the window object, so you can’t use it there.
The Answer 9
In short
window.onload
is not supported by IE 6-8document.onload
is not supported by any modern browser (event is never fired)
window.onload = () => console.log('window.onload works'); // fired document.onload = () => console.log('document.onload works'); // not fired