Reputation: 109
I'm trying to display images only after they load, using JavaScript.
I tried achieving that by adding a class (hidden) to them, then using addEventListener, the class is removed after they load.
Here is the code:
imgs = document.getElementsByTagName('img');
for (var i = 0; i < imgs.length; i++) {
imgs[i].classList.add('hidden');
imgs[i].addEventListener('load', this.classList.remove("hidden"));
}
After reloading the page, the first image disappears, which indicates that the class was added but something went wrong in the next line. In the console I get: Uncaught TypeError: Cannot read property 'remove' of undefined at that next line.
Upvotes: 0
Views: 3780
Reputation: 178350
// this code runs AFTER the data URI has loaded so it can be simple
document.querySelectorAll('img').forEach(function(img) {
img.addEventListener('load', function() {
this.classList.remove("hidden");
});
img.src = img.getAttribute("data-src");
});
.hidden {
visibility: hidden;
}
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==" data-src="https://via.placeholder.com/468x60?text=Image1" class="hidden" />
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==" data-src="https://via.placeholder.com/468x60?text=Image2" class="hidden" />
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==" data-src="https://via.placeholder.com/468x60?text=Image3" class="hidden" />
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==" data-src="https://via.placeholder.com/468x60?text=Image4" class="hidden" />
Upvotes: 1
Reputation: 65845
As stated, you're not using .addEventListener
correctly. Also, don't use getElementsByTagName()
as it returns a live node list. Instead, use .querySelectorAll()
.
Below, 4 different resolutions of the same image are being referenced. You'll see the code working as intended.
imgs = document.querySelectorAll('img');
for (var i = 0; i < imgs.length; i++) {
imgs[i].addEventListener('load', function(){
this.classList.remove("hidden")
});
}
img { border:1px solid grey; width:75px; }
.hidden { visibility:hidden; }
<img src="http://imgsrc.hubblesite.org/hvi/uploads/image_file/image_attachment/12710/web.jpg" class="hidden">
<img src="http://imgsrc.hubblesite.org/hvi/uploads/image_file/image_attachment/12704/large_web.jpg" class="hidden">
<img src="http://imgsrc.hubblesite.org/hvi/uploads/image_file/image_attachment/12707/print.jpg" class="hidden">
<img src="http://imgsrc.hubblesite.org/hvi/uploads/image_file/image_attachment/12702/full_jpg.jpg" class="hidden">
Upvotes: 0