So verbergen Sie das Symbol "Bild nicht gefunden" stillschweigend, wenn das Quellbild nicht gefunden wird

91

Wissen Sie, wie Sie das klassische Symbol "Bild nicht gefunden" vor einer gerenderten HTML-Seite verbergen können, wenn eine Bilddatei nicht gefunden wird?

Gibt es eine Arbeitsmethode mit JavaScript / jQuery / CSS?

systempuntoout
quelle
Andys Antwort ist korrekt. Möglicherweise möchten Sie stattdessen style.vsibility verwenden. Wenn Sie die Sichtbarkeit festlegen, behält das Element weiterhin seinen Platz in Ihrem Dokument bei, sodass keine lustigen Dokumentbewegungen auftreten.
Christian
Ich verstehe den Punkt nicht. Sie sollten einfach nicht versuchen, keine vorhandenen Ressourcen aus Ihrem HTML-Code zu erreichen. Die Verwendung von Javascript zum Verbergen von schlecht behandelten Ressourcen scheint mir eine hässliche Lösung zu sein.
Boris Delormas
1
@Kaaviar Sie verpassen den Punkt. Es gibt viele Hotlink-Bilder, die hier auf Stack Overflow beschädigt sind, da Bilder zum Zeitpunkt des Beitrags verfügbar sein können, aber einige Monate später nicht verfügbar sind. Diese Bilder werden still und sanft versteckt.
Systempuntoout
1
@systempuntoout: Ich bin mir nicht sicher, warum die beiden unterschiedlich behandelt werden. Ich habe ein fehlerhaftes Bild in Firefox und Chrome getestet. Es wird in Firefox nicht angezeigt, aber in Chrome als fehlerhaft. Es ist klar, dass dies etwas ist, über das Firefox selbst entscheidet, da es nicht den Anschein hat, dass irgendwelche Stile es beeinflussen. Übrigens, großartige Arbeit an StackPrinter.
Andy E
2
@systempuntoout: Ich habe ein bisschen mehr Informationen darüber herausgefunden, wie Firefox damit funktioniert. Siehe eine aktualisierte Geige und die [proprietäre Pseudoklasse :-moz-broken] ( developer.mozilla.org/en/CSS/:-moz-broken ). Ich habe mir gerade gedacht, dass eine Pseudoklasse nützlich sein würde, um kaputte Bilder zu stylen.
Andy E

Antworten:

102

Sie können das onerrorEreignis in JavaScript verwenden, um zu handeln, wenn ein Bild nicht geladen werden kann:

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

In jQuery (seit Sie gefragt haben):

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

Oder für alle Bilder:

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

Sie sollten visibility: hiddenanstelle von verwenden, .hide()wenn das Ausblenden der Bilder das Layout ändern könnte. Viele Websites im Web verwenden stattdessen ein Standardbild "kein Bild" und verweisen das srcAttribut auf dieses Bild, wenn der angegebene Bildspeicherort nicht verfügbar ist.

Andy E.
quelle
1
andy - was wäre die "globale" Lösung für ALLE Bilder? Ich denke, es wäre einfach genug, wenn sie alle in der gleichen
Abteilung wären
@jAndy: Ich war mir ziemlich sicher, aber dein Kommentar hat mich dazu gebracht, es noch einmal zu überprüfen. Ein schnelles Google hat diese w3schools-Seite zurückgegeben (sorry David, wenn Sie dies lesen), um die browserübergreifende Unterstützung anzuzeigen .
Andy E
2
@jim: Wenn Sie jQuery verwenden, können Sie das Ereignis auf alle Bilder anwenden. Verwenden Sie einfach den Tag-Selektor, z $("img").error(function () { /*...*/ });.
Andy E
@Andy E: hört sich gut an, +1. Die nächste interessante Frage wäre, errorob sie mit live()oder begrenzt werden kann delegate().
jAndy
3
visibilitywäre besser, da displaykann das layout brechen.
Gblazex
114
<img onerror='this.style.display = "none"'>
Gary Willoughby
quelle
Leider kann ich diese Lösung nicht verwenden, da HTML-Inhalte von einer Drittanbieter-Website über Json heruntergeladen werden und ich sie nicht bearbeiten kann. Danke trotzdem.
Systempuntoout
9
Super, genau das, was ich brauchte. Einfach und unauffällig, passt es in eine Vorlage!
Max
Obwohl schon ziemlich alt, ist das großartig! Gibt es eine Möglichkeit, die <a> -Tags, die mein jetzt verstecktes Bild umgeben, auch auszublenden?
SJDS
9

Ich habe die von Gary Willoughby vorgeschlagene Lösung leicht geändert, da das Symbol für defekte Bilder kurz angezeigt wird. Meine Lösung:

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

In meiner Lösung ist das Bild zunächst ausgeblendet und wird nur angezeigt, wenn es erfolgreich geladen wurde. Es hat einen Nachteil: Benutzer sehen keine Bilder mit halber Aufladung. Und wenn der Benutzer JS deaktiviert hat, werden keine Bilder angezeigt

Schärpe
quelle
1
... und Benutzer sehen nichts, wenn Javascript deaktiviert ist!
Yckart
4
@yckart Nun, wenn Benutzer Javascript deaktiviert haben, funktionieren die meisten nützlichen Webanwendungen sowieso nicht ...
Ehrfurcht
<img src="..." onerror="this.style.display = 'none'"/>könnte besser für die halb geladenen und nicht js Browser-Fälle funktionieren?
6

Um jeden Bildfehler auszublenden, fügen Sie einfach dieses JavaScript am Ende Ihrer Seite hinzu (kurz vor dem schließenden 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
quelle
Dies ist mein bevorzugter Ansatz, da dadurch sichergestellt wird, dass die Fehlerereignisse gebunden werden, bevor die Bilder fehlerhaft sind, und Sie nicht jedem Bild-Tag Fehlerfehlerattribute hinzufügen müssen. Stellen Sie sicher, dass Sie diesen Code nach all Ihren Bild-Tags, aber vor jedem anderen Javascript in <body> einfügen. Andernfalls kann ein blockierendes externes JS-Laden nach einem Bildfehler zur Ausführung führen.
Galater
Dieser funktioniert für mich, zusammen mit den Ratschlägen von Galatern, muss dieser JS ausgeführt werden, bevor irgendetwas ihn verzögert.
Adamz
Dies beantwortet die ursprüngliche Frage, ist jedoch ein Einwegprozess. Fügen Sie auch ein Onload-Ereignis hinzu, um Bilder, die anschließend geladen werden, wieder sichtbar zu machen. allimgs [i] .onload = function () {this.style.visibility = "sichtbar"; };
TRT 1968
5

Es mag etwas spät sein zu antworten, aber hier ist mein Versuch. Als ich auf dasselbe Problem stieß, habe ich es behoben, indem ich ein Div der Bildgröße verwendet und das Hintergrundbild auf dieses Div gesetzt habe. Wenn das Bild nicht gefunden wird, wird das div transparent gemacht, sodass alles ohne Java-Skript-Code ausgeführt wird.

Adway Lele
quelle
4

Wenn Sie die Antwort von Andy E schnell recherchieren , ist es nicht möglich, sie zu live()binden error.

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

Also musst du gehen wie

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

Binden Sie das error event handlerbeim Erstellen eines neuen Elements direkt .

jAndy
quelle
2
+1, der Grund dafür ist, dass das Fehler- DOM-Ereignis nicht sprudelt. Live und delegieren Sie die Arbeit, indem Sie den Ereignishandler weiter oben in der DOM-Hierarchie platzieren und das Ereignis erfassen, während es in die Luft sprudelt. Natürlich haben die jQuery-Entwickler dies für einige Ereignisse wie Fokus und Unschärfe
Andy E
@Andy E: Ja, sie haben bereits daran gearbeitet, dass dies möglicherweise nicht die schlechteste Idee ist, etwas Ähnliches zu tun error. Klingt nach einem nice to havefür mich.
Andy
3

Ich habe eine raffinierte Methode gefunden, um genau dies zu tun, während ich immer noch funktionsfähig ng-srcbin, wenn ich eine Direktive in Angular.js verwende und ...

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

Es handelt sich im Grunde genommen um ein kürzestes transparentes GIF (siehe http://proger.i-forge.net/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%) D0% B5% D1% 80 / [20121112]% 20Die% 20kleinste% 20transparente% 20pixel.html )

Natürlich könnte dieses GIF in einer globalen Variablen gespeichert werden, damit die Vorlagen nicht durcheinander gebracht werden.

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

und verwenden

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

etc.

Jacek Głodek
quelle
0

Verwenden Sie einfach einfaches CSS

.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
quelle