Src kaynak resmi bulunamadığında "Resim bulunamadı" simgesi sessizce nasıl gizlenir


91

Bir görüntü dosyası bulunamadığında, işlenmiş bir HTML sayfasından klasik "Görüntü bulunamadı" simgesinin nasıl gizleneceğini biliyor musunuz ?

JavaScript / jQuery / CSS kullanan herhangi bir çalışma yöntemi var mı?


Andy'nin cevabı doğru, ancak bunun yerine style.vsibility kullanmak isteyebilirsiniz. Görünürlüğü ayarlarsanız, öğe yine de belgenizdeki alanını korur, dolayısıyla komik belge hareketleri olmaz.
Christian

Asıl noktayı görmüyorum. Sadece html kodunuzdan mevcut kaynaklara ulaşmaya çalışmamanız gerekiyor. Kötü dağıtılmış kaynakları gizlemek için javascript kullanmak benim için çirkin bir çözüm gibi görünüyor.
Boris Delormas

1
@Kaaviar Bu noktayı kaçırıyorsunuz. Resimlerin gönderi sırasında mevcut olabileceği, ancak birkaç ay sonra kullanılamayacağı gerçeğinden dolayı Stack Overflow'da kırılmış çok sayıda hotlinkli resim var. Bu görüntüler sessizce ve nazikçe saklanıyor.
systempuntoout

1
@systempuntoout: İkisine neden farklı davranıldığından emin değilim. Bozuk bir resmi Firefox ve Chrome'da test ettim , Firefox'ta görünmüyor, ancak Chrome'da bozuk görünüyor. Bunun Firefox'un kendi başına karar verdiği bir şey olduğu açıktır, çünkü herhangi bir stilin onu etkilediği görülmemektedir. btw, StackPrinter'da harika bir çalışma.
Andy E

2
@systempuntoout: Firefox'un bununla nasıl çalıştığı hakkında biraz daha bilgi edindim. Bir gör güncel derecede rol ve [tescilli sözde sınıfı, :-moz-broken] ( developer.mozilla.org/en/CSS/:-moz-broken ). Daha önce kendi kendime sahte bir sınıfın bozuk görüntüleri şekillendirmek için yararlı olacağını düşünüyordum.
Andy E

Yanıtlar:


102

Sen kullanabilirsiniz onerrorbir görüntü yüküne başarısız olduğunda hareket etmek JavaScript olayı:

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

JQuery'de (sorduğunuzdan beri):

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

Veya tüm resimler için:

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

Görüntüleri gizlemek düzeni değiştirebilirse, visibility: hiddenbunun yerine kullanmalısınız .hide(). Web üzerindeki pek çok site, bunun yerine varsayılan bir "resim yok" srcresmi kullanır ve belirtilen resim konumu mevcut olmadığında özelliği o resme işaret eder .


1
andy - TÜM görüntülere uygulanacak 'küresel' çözüm nedir? ... sadece belgede TÜM görüntüleri merak - onlar aynı div tüm olsaydı kolay yeterli olacağını düşünüyorum
jim Tollan

@jAndy: Öyle olduğundan oldukça emindim, ancak yorumunuz beni iki kez kontrol ettirdi. Hızlı bir Google bu w3schools sayfasını (bunu okuyorsanız üzgünüm David) tarayıcılar arası desteğini göstererek döndürdü .
Andy E

2
@jim: jQuery kullanıyorsanız, olayı tüm görüntülere uygulayabilirsiniz. sadece etiket seçiciyi kullanın, ör $("img").error(function () { /*...*/ });.
Andy E

@Andy E: kulağa hoş geliyor, +1. sonraki ilginç soru " error" live()veya ile sınırlandırılabilir delegate().
jAndy

3
visibilitydaha iyi olurdu, çünkü displaydüzeni bozabilir.
gblazex

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

Ne yazık ki bu çözümü kullanamıyorum çünkü html içeriği Json aracılığıyla üçüncü taraf bir web sitesinden indiriliyor ve onu düzenleyemiyorum. Yine de teşekkürler.
systempuntoout

9
Harika, tam da ihtiyacım olan şey. Basit ve engelsiz, bir şablona sığar!
Maks.

Zaten oldukça eski olmasına rağmen, bu harika! Şimdi gizli olan resmimi çevreleyen <a> etiketlerini de gizlemenin bir yolu var mı?
SJDS

9

Gary Willoughby'nin önerdiği çözümü biraz değiştirdim, çünkü kırılmış görüntü simgesini kısaca gösteriyor. Çözümüm:

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

Benim çözümümde resim başlangıçta gizlidir ve yalnızca başarıyla yüklendiğinde gösterilir. Bir dezavantajı vardır: kullanıcılar yarı yüklenmiş görüntüleri görmezler. Ve kullanıcı JS'yi devre dışı bıraktıysa, hiçbir zaman herhangi bir resim görmez


1
... ve javascript devre dışı bırakılırsa kullanıcılar hiçbir şey görmez!
yckart

4
@yckart Eh, kullanıcıların ... javascript özürlü, en kullanışlı web uygulamaları zaten çalışmaz varsa
huşu

<img src="..." onerror="this.style.display = 'none'"/>yarı yüklü ve js olmayan tarayıcı durumları için daha iyi çalışabilir mi?

6

Her görüntü hatasını gizlemek için, bu JavaScript'i sayfanızın altına eklemeniz yeterlidir (kapanış gövde etiketinin hemen öncesine):

(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. 
        }
    }
})();

Bu benim tercih ettiğim yaklaşımımdır çünkü onerror olaylarının resimler hata yapmadan önce bağlanmasını sağlar ve her resim etiketine hata öznitelikleri eklemeniz gerekmez. Bu kodu tüm resim etiketlerinizden sonra, ancak <body> içindeki diğer javascript’ten önce koyduğunuzdan emin olun, aksi takdirde harici JS yükünün engellenmesi bir resim hatasından sonra çalıştırmaya neden olabilir.
galatyalılar

Galatyalılardan gelen tavsiyelerle birlikte bu benim için çalışıyor, geciktirebilecek herhangi bir şeyden önce bu JS'nin çalıştırılması gerekiyor.
Adamz

Bu, asıl soruyu yanıtlar, ancak bu tek yönlü bir süreçtir. Daha sonra yüklenen görüntüleri tekrar görünür hale getirmek için, bir yükleme olayı da ekleyin. allimgs [i] .onload = function () {this.style.visibility = "görünür"; };
TRT 1968

5

Cevap vermek için biraz geç olabilir, ama işte girişimim. Aynı sorunla karşılaştığımda, görüntü boyutunda bir div kullanarak ve bu div'e arka plan resmi ayarlayarak sorunu düzelttim. Görüntü bulunmazsa, div saydam hale getirilir, bu nedenle tamamı java-script kodu olmadan sessizce yapılır.


4

Andy E'nin cevabı hakkında hızlı bir araştırma yapmak , live()bağlanması mümkün değil error.

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

Yani gitmek zorundasın

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

error event handleryeni bir öğe oluşturmaya doğrudan bağlanır .


2
+1, bunun nedeni, onerror DOM olayının köpürmemesidir . olay işleyiciyi DOM hiyerarşisinin daha da yukarılara yerleştirerek ve olayı kabarcıklandıkça yakalayarak canlı ve delege çalışması. Tabii ki, jQuery Devs gibi bazı etkinlikler için bu çevrede çalışmış odak ve bulanıklık
Andy E verdi

@Andy E: Evet, zaten bunu çözdüler, benzer bir şeyi yapmak için en kötü fikir olmayabilir error. nice to haveBenim için bir gibi geliyor.
jAndy

3

ng-srcAngular.js'de yönergeyi kullanırken hala işlevselken, tam olarak bunu yapmak için şık bir yöntem buldum ve benzer ...

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

temelde en kısa şeffaf GIF (görüldüğü gibi 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 )

Tabii ki bu gif bazı global değişkenlerin içinde tutulabilir, böylece şablonları bozmaz.

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

ve kullan

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

vb.


0

Sadece basit css kullanı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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.