window.onload vs document.onload
When do they fire?
window.onload
- 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 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.