Cara menyembunyikan ikon "Gambar tidak ditemukan" secara diam-diam saat gambar sumber src tidak ditemukan

91

Apakah Anda tahu cara menyembunyikan ikon klasik "Gambar tidak ditemukan" dari halaman HTML yang dirender saat file gambar tidak ditemukan?

Adakah metode kerja yang menggunakan JavaScript / jQuery / CSS?

systempuntoout
sumber
Jawaban Andy benar, namun, Anda mungkin ingin menggunakan style.vsibility. Jika Anda mengatur visibilitas, elemen tersebut tetap menjaga ruang pada dokumen Anda, sehingga tidak ada pergerakan dokumen yang lucu.
Christian
Saya tidak mengerti maksudnya. Anda tidak seharusnya mencoba menjangkau sumber daya yang ada dari kode html Anda. Menggunakan javascript untuk menyembunyikan sumber daya yang ditangani dengan buruk tampaknya menjadi solusi yang buruk bagi saya.
Boris Delormas
1
@Kaaviar Anda melewatkan intinya. Ada banyak gambar hotlink rusak di sini di Stack Overflow karena gambar dapat tersedia pada saat posting, tetapi tidak tersedia beberapa bulan kemudian. Gambar-gambar ini disembunyikan dengan tenang dan lembut.
systempuntoout
1
@systempuntoout: Saya tidak yakin mengapa keduanya diperlakukan berbeda. Saya menguji gambar yang rusak di Firefox dan Chrome, itu tidak ditampilkan di Firefox tetapi ditampilkan sebagai rusak di Chrome. Jelas bahwa ini adalah sesuatu yang diputuskan oleh Firefox sendiri, karena tampaknya tidak ada gaya yang memengaruhinya. btw, kerja bagus di StackPrinter.
Andy E
2
@systempuntoout: Saya menemukan lebih banyak informasi tentang bagaimana Firefox bekerja dengan ini. Lihat biola yang diperbarui dan [kelas semu berpemilik, :-moz-broken] ( developer.mozilla.org/en/CSS/:-moz-broken ). Saya baru saja berpikir sendiri sebelumnya bahwa kelas semu akan berguna untuk menata gambar yang rusak.
Andy E

Jawaban:

102

Anda dapat menggunakan onerroracara di JavaScript untuk bertindak saat gambar gagal dimuat:

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

Di jQuery (karena Anda bertanya):

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

Atau untuk semua gambar:

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

Anda harus menggunakan visibility: hiddenalih-alih .hide()jika menyembunyikan gambar dapat mengubah tata letak. Banyak situs di web menggunakan gambar "tanpa gambar" default, yang mengarahkan srcatribut ke gambar tersebut saat lokasi gambar yang ditentukan tidak tersedia.

Andy E
sumber
1
andy - apa solusi 'global' untuk diterapkan ke SEMUA gambar ?? Saya pikir akan cukup mudah jika mereka semua dalam div yang sama - hanya bertanya-tanya tentang SEMUA gambar dalam dokumen ...
jim tollan
@jAndy: Saya cukup yakin, tetapi komentar Anda membuat saya memeriksa ulang. Google cepat mengembalikan halaman w3sekolah ini (maaf David, jika Anda membaca ini) menunjukkan dukungan lintas browser.
Andy E
2
@jim: Jika Anda menggunakan jQuery, Anda dapat menerapkan acara tersebut ke semua gambar. cukup gunakan pemilih tag, mis $("img").error(function () { /*...*/ });.
Andy E
@Andy E: kedengarannya bagus, +1. pertanyaan menarik berikutnya adalah, apakah " error" dibatasi dengan live()atau delegate().
jAndy
3
visibilityakan lebih baik, karena displaydapat merusak tata letak.
gblazex
114
<img onerror='this.style.display = "none"'>
Gary Willoughby
sumber
Sayangnya saya tidak dapat menggunakan solusi ini karena konten html diunduh dari situs web pihak ketiga melalui Json dan saya tidak dapat mengeditnya. Terima kasih.
systempuntoout
9
Luar biasa, hanya yang saya butuhkan. Sederhana dan tidak mengganggu, ini cocok dengan template!
Maksimal
Meskipun sudah cukup tua, ini bagus! Apakah ada cara untuk menyembunyikan tag <a> yang mengelilingi gambar saya yang sekarang tersembunyi juga?
SJDS
9

Saya sedikit memodifikasi solusi yang disarankan oleh Gary Willoughby, karena ini menunjukkan ikon gambar yang rusak secara singkat. Solusi saya:

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

Dalam solusi saya, gambar awalnya disembunyikan dan hanya ditampilkan jika berhasil dimuat. Ini memiliki kelemahan: pengguna tidak akan melihat gambar yang setengah dimuat. Dan jika pengguna telah menonaktifkan JS maka mereka tidak akan pernah melihat gambar apapun

Selempang
sumber
1
... dan pengguna tidak akan melihat apa pun, jika javascript dinonaktifkan!
yckart
4
@yckart Nah, jika pengguna menonaktifkan javascript, sebagian besar aplikasi web yang berguna tidak akan berfungsi ...
kagum pada
<img src="..." onerror="this.style.display = 'none'"/>mungkin bekerja lebih baik untuk kasus browser yang setengah dimuat dan non-js?
6

Untuk menyembunyikan setiap kesalahan gambar, cukup tambahkan JavaScript ini di bagian bawah halaman Anda (tepat sebelum penutup body tag):

(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. 
        }
    }
})();
Q_Mlilo
sumber
Ini adalah pendekatan pilihan saya karena cukup banyak memastikan bahwa kejadian onerror terikat sebelum gambar mengalami error dan Anda tidak perlu menambahkan atribut onerror ke setiap tag gambar. Pastikan untuk meletakkan kode ini setelah semua tag gambar Anda tetapi sebelum javascript lain yang ada di <body>, jika tidak, pemuatan JS eksternal yang memblokir dapat menyebabkan eksekusi setelah kesalahan gambar.
galatia
Yang ini berfungsi untuk saya, bersama dengan saran dari galatia, perlu menjalankan JS ini sebelum apa pun yang mungkin menunda itu.
Adamz
Ini menjawab pertanyaan awal, tetapi ini adalah proses satu arah. Untuk membuat gambar yang dimuat kemudian terlihat lagi, tambahkan juga peristiwa pemuatan. allimgs [i] .onload = function () {this.style.visibility = "terlihat"; };
TRT 1968
5

Mungkin agak terlambat untuk menjawabnya, tapi inilah usaha saya. Ketika saya menghadapi masalah yang sama saya memperbaikinya dengan menggunakan div ukuran gambar & pengaturan gambar latar belakang ke div ini. Jika gambar tidak ditemukan, div dibuat transparan, jadi semuanya dilakukan secara diam-diam tanpa kode java-script.

Adway Lele
sumber
4

Melakukan penelitian cepat terhadap jawaban Andy E , tidak mungkin live()mengikat error.

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

Jadi, Anda harus pergi seperti

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

langsung mengikat error event handleruntuk membuat elemen baru.

jAndy
sumber
2
+1, alasannya adalah karena kejadian DOM onerror tidak menggelembung. hidupkan dan delegasikan pekerjaan dengan menempatkan event handler lebih jauh ke atas hierarki DOM dan menangkap acara saat itu menggelembung. Tentu saja, pengembang jQuery telah mengatasi hal ini untuk beberapa acara seperti fokus dan blur
Andy E
@Andy E: Hore, mereka sudah mengatasinya, mungkin bukan ide terburuk untuk melakukan hal serupa error. Kedengarannya seperti itu nice to havebagi saya.
jAndy
3

saya telah menemukan metode yang bagus untuk melakukan hal ini, sementara masih berfungsi saat menggunakan ng-srcdirektif di Angular.js dan suka ...

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

itu pada dasarnya adalah GIF transparan terpendek (seperti yang terlihat http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82% D0% B5% D1% 80 / [20121112]% 20% 20termallest% 20transparent% 20pixel.html )

tentu saja gif ini dapat disimpan di dalam beberapa variabel global sehingga tidak akan mengacaukan template.

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

dan gunakan

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

dll.

Jacek Głodek
sumber
0

Gunakan saja css sederhana

.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;
}
Owais Bin Rizwan
sumber