Last updated on 19 August, 2018, 1:33pm by
UPDATE: 19/8/18 - I've added a condition to the getAllBackgroundImages function to display console errors for any missing background images, while your developing - to help speed up debugging.
This is a script I wrote to create a standard 'load' event for image assets implemented as background images via CSS. The script essentially looks for html elements with a 'preload' class (which you include on relevant elements), saves query results in an array and outputs each element in a hidden container in the DOM in a img tag - so we can listen for the img load event.
I currently use this script to check that banner assets have fully loaded before triggering main animation.
function imageBgPreload(onComplete) { // preload all background images try { runBgPreload(onComplete); console.log("preload try successful"); } catch(err) { console.log("preload skipped"); onComplete(); } function runBgPreload(onComplete) { var imageHolder = document.createElement("div"); imageHolder.setAttribute("id", "preBgHolder"); imageHolder.style.display = "none"; document.getElementsByTagName("body")[0].appendChild(imageHolder); var preloads = document.getElementsByClassName("preload"); var imageBank = document.getElementById("preBgHolder"); var preloadUrls = []; var images = []; var pre = []; var preStatus = []; var allImagesReady; var onCompleteFired = false; // grab all background images from CSS and preload in a CSS hidden div called preBgHolder. function getAllBackgroundImages() { for (i = 0; i < preloads.length; i++) { if (window.getComputedStyle(preloads[i]).getPropertyValue("background-image") != "none") { preloadUrls[i] = window.getComputedStyle(preloads[i]).getPropertyValue("background-image"); preloadUrls[i] = preloadUrls[i].replace(/\"/g, ''); // removes url quotes as computed different in safari preloadUrls[i] = preloadUrls[i].substring(4, preloadUrls[i].length - 1); images[i] = new Image(); images[i].src = preloadUrls[i]; images[i].classList.add("preBg"); imageBank.appendChild(images[i]); } else { console.error( "#" + preloads[i].id + " does not contain a background image"); } } } // check each img tag in the hidden div has loaded function statusListeners() { pre = document.getElementsByClassName("preBg"); for (i = 0; i < pre.length; i++) { pre[i].addEventListener("load", checkEachStatus, false); preStatus[i] = pre[i].complete; //console.log([i] + " load status: " + preStatus[i]); } } function checkEachStatus() { //console.log("checkEachStatus()"); function imageLoadedTrue(loadStatuses) { return loadStatuses == true; } for (i = 0; i < pre.length; i++) { preStatus[i] = pre[i].complete; //console.log(pre[i].complete + i); allImagesReady = preStatus.every(imageLoadedTrue); if (allImagesReady == true && onCompleteFired == false) { // mainFired used to stop runMain firing more than once if images load from cache //console.log("onComplete()"); onComplete(); onCompleteFired = true; } } }; getAllBackgroundImages(); statusListeners(); // if there are no preloads to work with run the fallack function anyway if (preloads.length == 0) { onComplete(); console.log("there was nothing to preload"); } } }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title >Check whether background images have loaded </title> <meta name="description" content=""> <meta name="viewport" content="width=device-width"> <link rel="stylesheet" href="styles.css"> <style> </style> </head> <body> <div id="mainContent"> <div id="image1" class="preload"> </div> <div id="image2" class="preload"> </div> <div id="image3" class="preload"> </div> <div id="image4" class="preload"> </div> </div> <script src="bgPreload.js"> </script> <script> function onceLoaded(){ // this callback function could be a script from any other file etc //console.log("onceLoaded fired"); var mainContent = document.getElementById("mainContent"); mainContent.style.opacity = 1; mainContent.style.visibility = "visible"; mainContent.style.top = "50px"; } imageBgPreload(onceLoaded); </script> </body> </html>