Resource Loading Events
Track loading of external resources with onload and onerror
Resource Loading Events
When your page loads images, scripts, stylesheets, or any external resource, you can track when they succeed or fail.
The Pattern
Every resource-loading element supports two events:
element.onload = function() {
// resource loaded successfully
};
element.onerror = function() {
// resource failed to load
};
Loading Images
<div id='image-demo'>
<p><button id='load-img'>Load Image</button></p>
<div id='img-container'></div>
<pre id='img-log' style='background:#f1f5f9;padding:8px;border-radius:4px;'></pre>
</div> const container = document.getElementById('img-container');
const log = document.getElementById('img-log');
document.getElementById('load-img').onclick = function() {
const img = new Image();
container.innerHTML = '';
container.appendChild(img);
img.onload = function() {
log.textContent = 'Image loaded! Width: ' + this.naturalWidth + 'px, Height: ' + this.naturalHeight + 'px';
this.disabled = true;
this.textContent = 'Loaded';
};
img.onerror = function() {
log.textContent = 'Image failed to load (placeholder URL used)';
};
// Using a real image URL
img.src = 'https://picsum.photos/200/150?random=' + Math.random();
log.textContent = 'Loading image...';
}; Checking Image Natural Dimensions
Once an image loads, naturalWidth and naturalHeight give you its intrinsic dimensions:
img.onload = function() {
console.log(this.naturalWidth + 'x' + this.naturalHeight);
};
Loading Scripts with onload/onerror
<div id='script-demo'>
<p><button id='load-ext-script'>Load External Script</button></p>
<p><button id='load-fail-script'>Load Failing Script</button></p>
<pre id='resource-log' style='background:#f1f5f9;padding:8px;border-radius:4px;'></pre>
</div> const log = document.getElementById('resource-log');
function loadScript(src, label) {
const script = document.createElement('script');
script.src = src;
script.onload = function() {
log.textContent = label + ' - loaded successfully at ' + new Date().toLocaleTimeString();
};
script.onerror = function() {
log.textContent = label + ' - FAILED to load! (script not found or network error)';
};
document.head.appendChild(script);
log.textContent = label + ' - downloading...';
}
document.getElementById('load-ext-script').onclick = function() {
loadScript('https://cdnjs.cloudflare.com/ajax/libs/seedrandom/3.0.5/seedrandom.min.js', 'Seedrandom (valid)');
this.disabled = true;
this.textContent = 'Loaded';
};
document.getElementById('load-fail-script').onclick = function() {
loadScript('https://example.com/nonexistent.js', 'Nonexistent script');
this.disabled = true;
this.textContent = 'Tried';
}; Loading Stylesheets
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'styles.css';
link.onload = function() {
console.log('Stylesheet loaded');
};
link.onerror = function() {
console.error('Stylesheet failed to load');
};
document.head.appendChild(link);
Handling Multiple Resources with Promises
Wrap resource loading in a Promise for cleaner async handling:
function loadImage(src) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = () => reject(new Error('Failed to load: ' + src));
img.src = src;
});
}
// Usage
loadImage('photo.jpg')
.then(img => document.body.appendChild(img))
.catch(err => console.error(err));
<div id='promise-demo'>
<p><button id='promise-load'>Load Image with Promise</button></p>
<div id='promise-container'></div>
<pre id='promise-log' style='background:#f1f5f9;padding:8px;border-radius:4px;'></pre>
</div> const log = document.getElementById('promise-log');
const container = document.getElementById('promise-container');
function loadImage(src) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = () => reject(new Error('Failed to load image'));
img.src = src;
log.textContent = 'Starting load: ' + src;
});
}
document.getElementById('promise-load').onclick = function() {
container.innerHTML = '';
loadImage('https://picsum.photos/300/200?random=' + Math.random())
.then(img => {
container.appendChild(img);
log.textContent = 'Image loaded! ' + img.naturalWidth + 'x' + img.naturalHeight;
})
.catch(err => {
log.textContent = 'Error: ' + err.message;
});
}; Lazy Loading Images
Modern browsers support native lazy loading:
<img src="photo.jpg" loading="lazy" alt="Photo">
Values: lazy (load when near viewport), eager (load immediately).
Preloading Critical Resources
Use <link rel="preload"> in HTML to hint to the browser:
<link rel="preload" href="font.woff2" as="font" crossorigin>
<link rel="preload" href="hero.jpg" as="image">
// Dynamic preload
const link = document.createElement('link');
link.rel = 'preload';
link.href = 'critical.js';
link.as = 'script';
document.head.appendChild(link);
The load Event on Window
The global window.onload fires when all resources on the page are loaded:
window.addEventListener('load', function() {
// Everything is loaded - images, styles, scripts, fonts
console.log('Page fully loaded');
});
Key Takeaways
- Every resource supports
onload(success) andonerror(failure) - Use
new Image()+onloadto preload images and get dimensions - Wrap
onload/onerrorin a Promise for clean async handling - Native
loading="lazy"defers off-screen image loading link rel="preload"hints the browser to fetch critical resources earlywindow.addEventListener('load')fires when all page resources are loaded- Always handle
onerror- resources fail (network issues, wrong URLs)
Keep learning
Related tutorials from across the library.
Page Lifecycle Events
DOMContentLoaded, load, beforeunload, and unload events explained
Web Development / Frontend / JavaScript DOM / Resource-Loading
Scripts: async and defer
Control script loading and execution with async and defer attributes
Web Development / Frontend / JavaScript DOM / Resource-Loading
Browser Environment & Specs
Understand the JavaScript browser environment - window, DOM, BOM, and ECMAScript
Web Development / Frontend / JavaScript DOM / Document