Here’s a detailed comparison of window.onload (JavaScript) and $(document).ready() (jQuery), including their differences, use cases, and examples:
1. Execution Timing
window.onload | $(document).ready() |
|---|
| Waits for the entire page to load (HTML, CSS, images, scripts, iframes). | Fires when the DOM is parsed (HTML structure is ready), before images/stylesheets finish loading. |
| Slower execution. | Faster execution. |
Example:
// JavaScript
window.onload = function() {
console.log("All resources loaded, including images");
};
// jQuery
$(document).ready(function() {
console.log("DOM ready, images may still be loading");
});
2. Multiple Handlers
window.onload | $(document).ready() |
|---|
Overrides previous handlers if assigned directly (e.g., window.onload = ...). | Supports multiple handlers; all execute in the order they’re defined. |
Use addEventListener('load', ...) to add multiple handlers in vanilla JS. | No risk of overwriting. |
Example:
// Vanilla JS (overrides previous handlers)
window.onload = function() { console.log("Handler 1"); };
window.onload = function() { console.log("Handler 2 (overrides 1)"); };
// Vanilla JS (supports multiple handlers)
window.addEventListener('load', () => console.log("Handler A"));
window.addEventListener('load', () => console.log("Handler B"));
// jQuery (multiple handlers work)
$(document).ready(() => console.log("jQuery Handler 1"));
$(document).ready(() => console.log("jQuery Handler 2"));
3. Syntax & Compatibility
window.onload | $(document).ready() |
|---|
| Native JavaScript (works without libraries). | Requires jQuery. |
Uses the load event. | Wraps the DOMContentLoaded event. |
Vanilla JS Alternative to ready():
document.addEventListener('DOMContentLoaded', function() {
console.log("DOM ready without jQuery");
});
4. Use Cases
window.onload | $(document).ready() |
|---|
| Scripts requiring image dimensions or external resources. | DOM manipulation (e.g., attaching event listeners, modifying elements). |
| Interacting with third-party widgets/ads that load slowly. | Initializing UI components (e.g., buttons, forms). |
5. Execution Order
$(document).ready() (or DOMContentLoaded) fires first.
window.onload fires later, after all resources load.
Example:
$(document).ready(() => console.log("DOM ready"));
window.onload = () => console.log("Window loaded");
// Output order:
// 1. "DOM ready"
// 2. "Window loaded"
6. Edge Cases & Pitfalls
- Image Loading: Using
ready() for image-dependent code may fail:
// Incorrect (image may not be loaded yet)
$(document).ready(() => {
console.log("Image height:", $("#myImage").height()); // Returns 0
});
// Correct
window.onload = () => {
console.log("Image height:", $("#myImage").height()); // Accurate value
};
- jQuery Shorthand:
$(function() { ... }) is equivalent to $(document).ready().
Performance Comparison
$(document).ready(): Better for perceived performance (executes earlier).
window.onload: Necessary for resource-heavy operations but delays interactivity.
Summary Table
| Feature | window.onload | $(document).ready() |
|---|
| Trigger Condition | All resources loaded | DOM parsed |
| Multiple Handlers | Yes (with addEventListener) | Yes |
| Execution Speed | Slower | Faster |
| jQuery Dependency | No | Yes |
| Use Case | Image/Resource-dependent scripts | DOM manipulation |
When to Use Which
- Use
$(document).ready() for most DOM interactions (faster execution).
- Use
window.onload for scripts requiring fully rendered resources (e.g., images, ads).