Tôi có thể lấy url hình nền của div không?


Câu trả lời:


190

Tôi thường thích .replace()biểu thức chính quy khi có thể, vì nó thường dễ đọc hơn: http://jsfiddle.net/mblase75/z2jKA/2

    $("div").click(function() {
        var bg = $(this).css('background-image');
        bg = bg.replace('url(','').replace(')','').replace(/\"/gi, "");
        alert(bg);
    });

4
Điều gì sẽ xảy ra nếu URL hình nền giống như thế url(my%20picture%20Copy\(1\).jpg)? Thay thế của bạn gây ra biến bg my%20picture%20Copy\(1\.jpg). Nó cũng không loại bỏ trích dẫn (ví dụ url("the picture.jpg")).
Benjamin Manns

1
Sau đó, bạn sẽ phải thêm một số mã để bỏ thoát %20dấu ngoặc đơn và hoặc tự hỏi bản thân xem liệu bạn có thực sự cần chúng ở đó ngay từ đầu hay không. Nếu trích dẫn có vấn đề, hãy sử dụng giải pháp của RobW để thay thế.
Blazemonger

1
Không thể xử lý nhiều hình nền.
Marcel

1
@Marcel Dễ dàng nếu bạn chỉ có hình ảnh; chỉ cần tách chuỗi trên dấu phẩy. Sẽ khó hơn nếu bạn có những thứ như gradient tuyến tính trong đó, vì chúng cũng có dấu phẩy.
Blazemonger

1
điều này sẽ không hoạt động nếu background-image là một cái gì đó giống nhưbackground-image:linear-gradient(rgba(0,0,0,0.2), rgba(0,0,0,0.4)), url("https://mdn.mozillademos.org/files/7693/catfront.png")
glasspill

52

Có, điều đó có thể xảy ra:

$("#id-of-button").click(function() {
    var bg_url = $('#div1').css('background-image');
    // ^ Either "none" or url("...urlhere..")
    bg_url = /^url\((['"]?)(.*)\1\)$/.exec(bg_url);
    bg_url = bg_url ? bg_url[2] : ""; // If matched, retrieve url, otherwise ""
    alert(bg_url);
});

Tôi muốn cảnh báo nó không đặt nó. Cảnh báo hoặc viết các con đường trên console.log
jQuerybeast

để ghi vào giao diện điều khiển thử: console.log ($ ( '# div1') css ( 'background-image').)
Mandeep Pasbola

@RobW Cảm ơn bạn. Đó url in (google.com) thay vì chỉ các miền
jQuerybeast

@jQuerybeast Mã của tôi không đặt CSS. Các .cssphương thức trả về giá trị của một tài sản, khi gọi với một đối số.
Rob W

2
@tim Không, nó chính xác hơn. Hãy tưởng tượng: background-image: url('photo(2012).png');Với đoạn mã của bạn, bạn sẽ nhận được "'photo (2012.png')", điều này rõ ràng là không chính xác.
Rob W

21

Tôi có câu trả lời được cải thiện một chút, xử lý các định nghĩa CSS mở rộng như:

background-image: url(http://d36xtkk24g8jdx.cloudfront.net/bluebar/359de8f/images/shared/noise-1.png), -webkit-linear-gradient(top, rgb(81, 127, 164), rgb(48, 96, 136))

Mã JavaScript:

var bg = $("div").css("background-image")
bg = bg.replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, '')

Kết quả:

"http://d36xtkk24g8jdx.cloudfront.net/bluebar/359de8f/images/shared/noise-1.png"

điều này sẽ không hoạt động nếu hình nền là một cái gì đó giống như hình nền: tuyến tính-gradient (rgba (0,0,0,0.2), rgba (0,0,0,0.4)), url (" mdn.mozillademos .org / files / 7693 / catfront.png " )
glasspill,

10

Như đã đề cập, giải pháp Blazemongers không xóa được dấu ngoặc kép (ví dụ như Firefox trả về). Vì tôi thấy giải pháp của Rob Ws khá phức tạp, nên thêm 2 xu của tôi vào đây:

$('#div1').click (function(){
  url = $(this).css('background-image').replace(/^url\(['"]?/,'').replace(/['"]?\)$/,'');
  alert(url);
})

6

Tôi nghĩ rằng việc sử dụng một biểu thức chính quy cho điều này bị lỗi chủ yếu do

  • Sự đơn giản của nhiệm vụ
  • Chạy một biểu thức chính quy luôn tốn nhiều cpu hơn / lâu hơn là cắt một chuỗi.

Vì các thành phần url ("") là không đổi, hãy cắt chuỗi của bạn như sau:

$("#id").click(function() {
     var bg = $(this).css('background-image').trim();
     var res = bg.substring(5, bg.length - 2);
     alert(res);
});

Có vẻ như một giải pháp tốt. Nhưng điều này không hoạt động trong Safari. Với cách tiếp cận này, bạn nhận được "ttps: //.....jp" thay vì "https: //.....jpg" ..
IndikatorDesign

Tôi tin rằng các "s là tùy chọn trong cú pháp này. url(myimg.jpg)hoạt động tốt ở đây.
Abraham Murciano Benzadon

5

Tôi đang sử dụng cái này

  function getBackgroundImageUrl($element) {
    if (!($element instanceof jQuery)) {
      $element = $($element);
    }

    var imageUrl = $element.css('background-image');
    return imageUrl.replace(/(url\(|\)|'|")/gi, ''); // Strip everything but the url itself
  }

1
Hoạt động tốt. Cảm ơn!
IndikatorDesign

4

Đây là một regex đơn giản sẽ loại bỏ url("")khỏi chuỗi được trả về.

var css = $("#myElem").css("background-image");
var img = css.replace(/(?:^url\(["']?|["']?\)$)/g, "");

1

Chỉ sử dụng một lệnh gọi tới replace(phiên bản regex): var bgUrl = $('#element-id').css('background-image').replace(/url\(("|')(.+)("|')\)/gi, '$2');

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.