JSFiddle - React, Tailwind, and code Playground
HTML
<button id="loadImages">Load</button>
<div id="images">
<img src="http://placekitten.com/21/20" alt="" />
</div>
JavaScript
// The DOM changes watcher
var observeDOM = (function(){
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
eventListenerSupported = window.addEventListener;
return function(obj, callback){
if( MutationObserver ){
// define a new observer
var obs = new MutationObserver(function(mutations, observer){
if( mutations[0].addedNodes.length || mutations[0].removedNodes.length )
callback();
});
// have the observer observe foo for changes in children
obs.observe( obj, { childList:true, subtree:true });
}
else if( eventListenerSupported ){
obj.addEventListener('DOMNodeInserted', callback, false);
obj.addEventListener('DOMNodeRemoved', callback, false);
}
}
})();
// Observe the DOM for changes
observeDOM(document.body, function(){
checkNewImages();
});
var checkNewImages = function() {
var images = document.querySelectorAll('img:not([data-loaded]');
for(var i = 0; i < images.length; i++) {
addImageLoadedEvent(images[i]);
}
}
var addImageLoadedEvent = function(img) {
if (img.complete) {
onImageLoaded(img);
} else {
img.addEventListener('load', function(event) {
onImageLoaded(event.target);
});
}
}
// Fired once an image is loaded
var onImageLoaded = function(img) {
img.setAttribute('data-loaded', 'true');
if(document.querySelectorAll('img:not([data-loaded])').length === 0) {
// doWhateverYouNeedToDoWhenAnImageIsLoaded();
alert('all new images loaded');
}
}
// Append a random new (large) image to the DOM to test the events
document.getElementById('loadImages').onclick = function() {
var rand = 1200 + (Math.floor(Math.random() * 100) + 1);
var newImages = '<img src="http://placekitten.com/20/22" />'
+ '<img...