2010-03-12 28 views
10

Cách tốt nhất để tìm tất cả hình nền trên một trang nhất định bằng cách sử dụng javascript là gì?Danh sách tất cả hình nền trong DOM

Kết quả cuối cùng lý tưởng sẽ là một mảng của tất cả các url.

+7

những người đam mê jQuery, chú ý từ khóa 'không-khuôn khổ'. –

+0

Vấn đề chính là các hình ảnh và các lớp có thể được định nghĩa bên trong lớp CSS. Hình ảnh sẽ được tải xuống riêng. Tuy nhiên, bạn có thể tạo một HttpHandler để xử lý tất cả các hình ảnh. Để làm điều đó bạn sẽ cần phải sử dụng .NET framework. – azamsharp

Trả lời

0

Đây là một vấn đề phức tạp. Lý do là hình nền có thể được áp dụng cho phần tử bằng cách sử dụng một tệp CSS riêng biệt. Bằng cách này, phân tích cú pháp tất cả các đối tượng trong DOM và kiểm tra hình nền của chúng sẽ không hoạt động.

Một trong những cách tôi có thể thấy là tạo một HttpHandler đơn giản sẽ hoạt động trên tất cả các loại hình ảnh. Khi hình ảnh được tham chiếu bên trong tệp CSS, chúng được tải xuống dưới dạng một thực thể riêng biệt. Điều này có nghĩa HttpHandler sẽ có thể nắm bắt được loại hình ảnh và sau đó thực hiện trên nó.

Có thể giải pháp phía máy chủ là cách tốt nhất để thực hiện điều này!

+2

OP yêu cầu cách truy cập * hình nền *, không phải hình ảnh thông thường. –

1

Một trong những cách là xem qua tất cả đối tượng tài liệu và nhận các kiểu đó. Sau đó kiểm tra thuộc tính style.background trên "url (" string và nếu nó phù hợp thì lấy đường dẫn giữa "url (" và ")" và đặt nó vào mảng. Thuật toán cho JS. Hãy thử tự làm. . đang

+0

Nhưng nó có thể không hoạt động nếu các kiểu được xác định trong tệp .css. – azamsharp

+0

Nó sẽ. Cứ thử đi. Không có mater nơi chúng được khai báo – Artic

3

Nếu không sử dụng jQuery, bạn có thể làm:

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))); 
     } 
    } 
}); 
+0

Trong Chrome, tôi thực sự tìm thấy nó trong 'tag.style.backgroundImage', nhưng nếu không thì nó hoạt động như một nét duyên dáng. – lapo

11

// 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; 
} 
+0

Đối với dòng thứ 6, không nên là [^ ") '] thay vì [^")] để bạn có thể đối sánh các url kết thúc bằng một trích dẫn đơn? –

1

Dưới đây là một cách để kiểm tra những gì nền url có trong phong cách trên trang (xem Ma, không có 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 

Với điều này trên trang, bạn có thể nhận được một mảng của các url với npup.getBackgroundUrls(); tôi đã làm một số (superfluos?) Cho ý kiến ​​trong đoạn code đó giải thích cách thức nó đi về. Nó không lấy phong cách nội tuyến, nhưng tôi nghĩ rằng không có vấn đề gì với bạn? Kiểu trong trang tính bên ngoài và trong các thẻ <style> trên trang được nhặt rác.

Những thói quen rất dễ dàng để sửa đổi nếu bạn muốn giữ một số, hoặc giữ các hiệp hội các quy tắc thực tế rằng một url được tìm thấy trong, vv

+1

Điều này có hiệu quả với tôi. Đặc biệt hữu ích cho việc tải trước hình ảnh được đính kèm với các phần tử chưa có trong DOM. Cảm ơn vì đăng! – donut

+1

Đã cập nhật mã này để hỗ trợ trình duyệt chéo tốt hơn và do đó nó không cháy trừ khi được gọi đầu tiên: https://gist.github.com/1293825 Một điều quan trọng cần lưu ý là phương pháp này có thể sẽ không hoạt động đối với bảng định kiểu khác nhau tên miền và cổng hơn trang hiện tại. – donut

+1

Tôi đã cải thiện thêm phiên bản của chức năng này để xử lý tốt hơn IE 7 & 8. Chúng chuyển đổi các thuộc tính CSS thành chữ hoa và chức năng này không thực hiện tìm kiếm phân biệt chữ hoa chữ thường. Phiên bản cập nhật có cùng URL: https://gist.github.com/1293825 – donut

Các vấn đề liên quan