Cách ẩn biểu tượng “Không tìm thấy hình ảnh” khi không tìm thấy hình ảnh nguồn src


91

Bạn có biết cách ẩn biểu tượng “Không tìm thấy hình ảnh” cổ điển khỏi trang HTML được hiển thị khi không tìm thấy tệp hình ảnh không?

Bất kỳ phương pháp làm việc nào sử dụng JavaScript / jQuery / CSS?


Câu trả lời của Andy là đúng, tuy nhiên, bạn có thể muốn sử dụng style.vsibility thay thế. Nếu bạn đặt chế độ hiển thị, phần tử vẫn giữ không gian của nó trên tài liệu của bạn, do đó không có chuyển động tài liệu buồn cười.
Christian

Tôi không thấy vấn đề. Bạn chỉ không nên cố gắng tiếp cận không có nguồn cung cấp lại hiện có từ mã html của bạn. Với tôi, việc sử dụng javascript để ẩn các nguồn ressource được xử lý kém có vẻ là một giải pháp không tốt.
Boris Delormas

1
@Kaaviar Bạn đang bỏ sót điểm. Có rất nhiều hình ảnh được liên kết nóng bị hỏng ở đây trên Stack Overflow do thực tế là hình ảnh có thể có tại thời điểm đăng bài, nhưng không có sẵn sau đó vài tháng. Những hình ảnh này được ẩn đi một cách âm thầm và nhẹ nhàng.
systempuntoout

1
@systempuntoout: Tôi không chắc tại sao cả hai lại được đối xử khác nhau. Tôi đã kiểm tra một hình ảnh bị hỏng trong Firefox và Chrome, nó không hiển thị trong Firefox nhưng hiển thị là bị hỏng trong Chrome. Rõ ràng đây là thứ mà Firefox đang tự quyết định, vì có vẻ như không có bất kỳ kiểu nào đang ảnh hưởng đến nó. btw, công việc tuyệt vời trên StackPrinter.
Andy E,

2
@systempuntoout: Tôi đã tìm hiểu thêm một chút thông tin về cách Firefox hoạt động với điều này. Xem fiddle cập nhật và [lớp giả độc quyền, :-moz-broken] ( developer.mozilla.org/en/CSS/:-moz-broken ). Lúc nãy tôi chỉ nghĩ với bản thân rằng một lớp giả sẽ hữu ích để tạo kiểu cho những hình ảnh bị hỏng.
Andy E

Câu trả lời:


102

Bạn có thể sử dụng onerrorsự kiện trong JavaScript để hành động khi hình ảnh không tải được:

var img = document.getElementById("myImg");
img.onerror = function () { 
    this.style.display = "none";
}

Trong jQuery (kể từ khi bạn hỏi):

$("#myImg").error(function () { 
    $(this).hide(); 
});

Hoặc cho tất cả các hình ảnh:

$("img").error(function () { 
    $(this).hide();
    // or $(this).css({visibility:"hidden"}); 
});

Bạn nên sử dụng visibility: hiddenthay vì .hide()nếu ẩn hình ảnh có thể thay đổi bố cục. Nhiều trang web sử dụng hình ảnh "không có hình ảnh" mặc định để thay thế, trỏ srcthuộc tính đến hình ảnh đó khi vị trí hình ảnh được chỉ định không khả dụng.


1
andy - giải pháp 'toàn cầu' để áp dụng cho TẤT CẢ hình ảnh là gì ?? tôi nghĩ sẽ dễ dàng đến mức nếu tất cả đều ở cùng một div - chỉ cần thắc mắc về TẤT CẢ các hình ảnh trong tài liệu ...
jim phonean

@jAndy: Tôi khá chắc chắn là như vậy, nhưng nhận xét của bạn khiến tôi phải kiểm tra lại. Google đã nhanh chóng trả lại trang w3schools này (xin lỗi David, nếu bạn đang đọc trang này) cho biết hỗ trợ nhiều trình duyệt.
Andy E

2
@jim: Nếu đang sử dụng jQuery, bạn có thể áp dụng sự kiện cho tất cả các hình ảnh. chỉ cần sử dụng bộ chọn thẻ, ví dụ $("img").error(function () { /*...*/ });.
Andy E

@Andy E: nghe hay đấy, +1. câu hỏi thú vị tiếp theo sẽ là " error" có ràng buộc với live()hoặc delegate().
jAndy

3
visibilitysẽ tốt hơn, vì displaycó thể phá vỡ bố cục.
gblazex

114
<img onerror='this.style.display = "none"'>

Rất tiếc, tôi không thể sử dụng giải pháp này vì nội dung html được tải xuống từ trang web của bên thứ ba thông qua Json và tôi không thể chỉnh sửa nó. Dẫu sao cũng xin cảm ơn.
systempuntoout

9
Tuyệt vời, đúng những gì tôi cần. Đơn giản và không phô trương, nó phù hợp với một khuôn mẫu!
Tối đa

Mặc dù đã khá cũ rồi nhưng điều này thật tuyệt! Có cách nào để ẩn các thẻ <a> xung quanh hình ảnh hiện đã bị ẩn của tôi không?
SJDS

9

Tôi đã sửa đổi một chút giải pháp do Gary Willoughby đề xuất, vì nó hiển thị ngắn gọn biểu tượng hình ảnh bị hỏng. Giải pháp của tôi:

    <img src="..." style="display: none" onload="this.style.display=''">

Trong giải pháp của tôi, hình ảnh ban đầu được ẩn và chỉ hiển thị khi nó được tải thành công. Nó có một nhược điểm là người dùng sẽ không nhìn thấy hình ảnh được tải xuống một nửa. Và nếu người dùng đã tắt JS thì họ sẽ không bao giờ thấy bất kỳ hình ảnh nào


1
... và người dùng sẽ không nhìn thấy gì, nếu javascript bị tắt!
yckart

4
@yckart Chà, nếu người dùng đã tắt javascript, hầu hết các ứng dụng web hữu ích sẽ không hoạt động ...
awe

<img src="..." onerror="this.style.display = 'none'"/>có thể hoạt động tốt hơn cho các trường hợp trình duyệt được tải một nửa và không phải js?

6

Để ẩn mọi lỗi hình ảnh, chỉ cần thêm JavaScript này ở cuối trang của bạn (ngay trước thẻ đóng nội dung):

(function() {
    var allimgs = document.images;
    for (var i = 0; i < allimgs.length; i++) {
        allimgs[i].onerror = function() {
            this.style.visibility = "hidden"; // Other elements aren't affected. 
        }
    }
})();

Đây là cách tiếp cận ưa thích của tôi vì nó đảm bảo khá nhiều rằng các sự kiện onerror được ràng buộc trước khi hình ảnh bị lỗi và bạn không phải thêm thuộc tính onerror vào mỗi thẻ hình ảnh. Hãy chắc chắn đặt mã này sau tất cả các thẻ hình ảnh của bạn nhưng trước bất kỳ javascript nào khác trong <body>, nếu không việc chặn tải JS bên ngoài có thể gây ra lỗi thực thi sau khi hình ảnh bị lỗi.
galatians

Điều này phù hợp với tôi, cùng với lời khuyên từ các galatians, cần phải thực thi JS này trước bất kỳ điều gì có thể làm chậm trễ nó.
Adamz

Điều này trả lời câu hỏi ban đầu, nhưng đó là một quá trình một chiều. Để hiển thị lại hình ảnh tải sau đó, hãy thêm một sự kiện khi tải. allimgs [i] .onload = function () {this.style.visibility = "display"; }
TRT 1968,

5

Có thể hơi muộn để trả lời, nhưng đây là nỗ lực của tôi. Khi tôi gặp phải vấn đề tương tự, tôi đã khắc phục nó bằng cách sử dụng div có kích thước bằng hình ảnh và đặt background-image thành div này. Nếu không tìm thấy hình ảnh, div sẽ được hiển thị trong suốt, vì vậy tất cả được thực hiện một cách im lặng mà không cần mã java-script.


4

Nghiên cứu nhanh về câu trả lời của Andy E , không thể live()ràng buộc được error.

// won't work (chrome 5)
$('img').live('error', function(){
     $(this).css('visibility', 'hidden');
});

Vì vậy, bạn phải đi như

$('<img/>', {
  src:    'http://www.notarget.com/fake.jpg',
  error:  function(e){
    $(this).css('visibility', 'hidden');
  }
}).appendTo(document.body);

ràng buộc trực tiếp khi error event handlertạo một phần tử mới.


2
+1, lý do cho điều này là sự kiện onerror DOM không bong bóng. trực tiếpủy quyền công việc bằng cách đặt trình xử lý sự kiện lên cao hơn nữa trong phân cấp DOM và nắm bắt sự kiện khi nó nổi lên. Tất nhiên, các nhà phát triển jQuery đã làm việc xung quanh này cho một số sự kiện như tập trungmờ
Andy E

@Andy E: Đúng vậy, họ đã giải quyết được điều đó, có thể không phải là ý tưởng tồi tệ nhất để làm một điều tương tự error. Nghe giống như một nice to havecho tôi.
jAndy

3

tôi đã tìm thấy một phương pháp tiện lợi để thực hiện chính xác điều này, trong khi vẫn hoạt động khi sử dụng ng-srcchỉ thị trong Angular.js và như ...

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src='data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='"
  />

về cơ bản nó là một GIF trong suốt ngắn nhất (như đã thấy http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82% D0% B5% D1% 80 / [20121112]% 20The% 20smallest% 20transparent% 20pixel.html )

tất nhiên gif này có thể được giữ bên trong một số biến toàn cục để nó không làm rối các mẫu.

<script>
  window.fallbackGif = "..."
</script>

Và sử dụng

<img
  ng-src="{{myCtrl.myImageUrlThatWillDynamicallyChange}}" 
  onerror="this.src=fallbackGif"
  />

Vân vân.


0

Chỉ cần sử dụng css đơn giản

.AdminImageHolder {
display: inline-block;
min-width: 100px;
max-width: 100px;
min-height: 100px;
max-height: 100px;
background: url(img/100x100.png) no-repeat;
border: 1px solid #ccc;
}
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.