Fallback background-image if default doesn't exist

后端 未结 5 719
忘掉有多难
忘掉有多难 2020-11-29 09:43

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

5条回答
  •  旧巷少年郎
    2020-11-29 10:28

    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
    

提交回复
热议问题