Список всех фоновых изображений в DOM

Что лучший способ состоит в том, чтобы найти всеми фоновыми изображениями на данной странице с помощью JavaScript?

Идеальным конечным результатом был бы массив всего URL.

10
задан AutomaticDrone 12 March 2010 в 04:25
поделиться

5 ответов

Это сложная проблема. Причина в том, что фоновое изображение может быть применено к элементу с помощью отдельного файла CSS. Таким образом, анализ всех объектов в DOM и проверка их фонового изображения не сработают.

Один из способов, который я вижу, - это создать простой HttpHandler, который будет работать со всеми типами изображений. Когда изображения упоминаются внутри файла CSS, они загружаются как отдельный объект. Это означает, что HttpHandler сможет захватить тип изображения и затем выполнить его.

Возможно, решение на стороне сервера - лучший способ справиться с этим!

0
ответ дан 3 December 2019 в 21:21
поделиться

Один из способов - просмотреть все объекты документа и найти стили. Затем протестируйте атрибут style.background в строке «url (» и, если он совпадает, получите путь между «url (» и «)» и поместите его в массив. Алгоритм для JS. Попробуйте сделать это самостоятельно. Найдутся проблемы - пришел с код.

1
ответ дан 3 December 2019 в 21:21
поделиться

//alert(getallBgimages())

function getallBgimages(){
 var url, B= [], A= document.getElementsByTagName('*');
 A= B.slice.call(A, 0, A.length);
 while(A.length){
  url= document.deepCss(A.shift(),'background-image');
  if(url) url=/url\(['"]?([^")]+)/.exec(url) || [];
  url= url[1];
  if(url && B.indexOf(url)== -1) B[B.length]= url;
 }
 return B;
}

document.deepCss= function(who, css){
 if(!who || !who.style) return '';
 var sty= css.replace(/\-([a-z])/g, function(a, b){
  return b.toUpperCase();
 });
 if(who.currentStyle){
  return who.style[sty] || who.currentStyle[sty] || '';
 }
 var dv= document.defaultView || window;
 return who.style[sty] || 
 dv.getComputedStyle(who,"").getPropertyValue(css) || '';
}

Array.prototype.indexOf= Array.prototype.indexOf || 
 function(what, index){
 index= index || 0;
 var L= this.length;
 while(index< L){
  if(this[index]=== what) return index;
  ++index;
 }
 return -1;
}
11
ответ дан 3 December 2019 в 21:21
поделиться

Без использования jQuery вы можете сделать:

var elementNames = ["div", "body", "td"] // Put all the tags you want bg images for here
var allBackgroundURLs = new Array();
elementNames.forEach( function(tagName) {
     var tags = document.getElementsByTagName(tagName);
     var numTags = tags.length;
     for (var i = 0; i < numTags; i++) {
         tag = tags[i];
         if (tag.style.background.match("url")) {
             var bg = tag.style.background;
             allBackgroundURLs.push(bg.substr(bg.indexOf("url") + 4, bg.lastIndexOf(")") - (bg.indexOf("url") + 4) ) );
         }
     }
});
4
ответ дан 3 December 2019 в 21:21
поделиться

Вот способ проверить, какие фоновые URL-адреса есть в стилях на странице (посмотрите, Ма, без jQuery):

window.npup = (function (doc) {
  var sheets = doc.styleSheets;
  var hash = {}, sheet, rules, rule, url, match;
  // loop the stylesheets
  for (var sheetIdx=0, sheetsLen=sheets.length; sheetIdx<sheetsLen; ++sheetIdx) {
    sheet = sheets[sheetIdx];
    // ie or w3c stylee rules property?
    rules = sheet.rules ? sheet.rules : sheet.cssRules;
    // loop the rules
    for (var ruleIdx=0, rulesLen=rules.length; ruleIdx<rulesLen; ++ruleIdx) {
      rule = rules[ruleIdx];
      if (rule.selectorText && rule.style.cssText) {
        // check if there's a style setting we're interested in..
        if (rule.style.cssText.match(/background/)) {
          // ..and if it has an url in it, put it in the hash
          match = /url\(([^)]*)\)/.exec(rule.style.cssText);
          if (match) {hash[match[1]] = true;}
        }
      }
    }
  }
  // return an array of unique urls
  var urls = [];
  for (url in hash) {urls.push(url);}
  // export a getter for what we found
  return {
    getBackgroundUrls: function () { return urls;}
  };
})(document); // submit reference to the document of interest

С помощью этого на странице вы можете получить массив URL-адресов с npup.getBackgroundUrls ( ); Я сделал несколько (лишних?) Комментариев в коде, объясняющих, как это происходит. Он не захватывает встроенные стили, но я думаю, для вас это не было проблемой ? Стили во внешних листах и ​​в тегах