I want to set an image as a background, however the image name might be either bg.png or bg.jpg.
Is there any non-javascript way to create
I wanted to have a solution that doesn't load the images twice. For example CDN with a fallback is not very good if it always loads the original images also. So I ended up writing a Javascript to manipulate the loaded CSS DOM.
var cdn = "https://mycdn.net/"; // Original location or thing to find
var localImageToCssPath = "../"; // Replacement, Css are in /css/ folder.
function replaceStyleRule(allRules){
var rulesCount = allRules.length;
for (var i=0; i < rulesCount; i++)
{
if(allRules[i].style !== undefined && allRules[i].style !== null &&
allRules[i].style.backgroundImage !== undefined &&
allRules[i].style.backgroundImage !== null &&
allRules[i].style.backgroundImage !== "" &&
allRules[i].style.backgroundImage !== "none" &&
allRules[i].style.backgroundImage.indexOf(cdn) > -1
)
{
var tmp = allRules[i].style.backgroundImage.replace(cdn, localImageToCssPath);
//console.log(tmp);
allRules[i].style.backgroundImage = tmp;
}
if(allRules[i].cssRules !== undefined && allRules[i].cssRules !== null){
replaceStyleRule(allRules[i].cssRules);
}
}
}
function fixBgImages(){
var allSheets = document.styleSheets;
if(allSheets===undefined || allSheets===null){
return;
}
var sheetsCount = allSheets.length;
for (var j=0; j < sheetsCount; j++)
{
var allRules = null;
try{
allRules = allSheets[j].cssRules;
} catch(e){
// Access can be denied
}
if(allRules!==undefined && allRules!==null){
replaceStyleRule(allRules);
}
}
}
// use fixBgImages() in e.g. onError