2013-11-24 18 views
5

Ich habe eine Liste der Bilder, wobei jedes Bild in einem li gewickelt ist:ausblenden li wenn gebrochen Bild

<li><a href='http://www.so.com'><img src='http://www.so.com/1.jpg'></a></li> 

Wie kann ich diese ganze li verstecken wenn Bild 1.jpg ist gebrochen, als ob es nie im DOM existierte?

Ich fand einige gute js auf, wie man hide the image und lernte von another SO post, dass ich display:none will, so dass ich keine leere Zeile erstellen. Aber ich habe Probleme, diese zusammenzusetzen.

+0

können Sie ein Problem dieses Problems zusammenstellen? – karthikr

+0

@karthikr Ich fange an, gerade jetzt daran zu arbeiten und bearbeite die Frage mit dem Link. Danke, gute Idee. – Chris

+0

http://jsfiddle.net/H7Aq7/6/ – Chris

Antwort

8

Sie können einen onerror Handler für das Bild verwenden:

<li><a href='http://www.so.com'> 
<img src='http://www.so.com/1.jpg' onerror='hideContainer(this)'> 
</a></li> 

// this function must be in the global scope 
function hideContainer(el) { 
    $(el).closest("li").hide(); 
} 

Oder könnten Sie es sogar nur entfernen, wenn Sie es wirklich wollen, als wäre es nie in den DOM vorhanden:

// this function must be in the global scope 
function hideContainer(el) { 
    $(el).closest("li").remove(); 
} 

Wenn Sie keinen onerror Handler in den HTML-Code (der einzige zuverlässige Ort, den Sie es setzen können) setzen, dann können Sie die Bilder zunächst ausblenden und dann überprüfen .complete wenn Ihre jQuery läuft und wenn das Bild noch nicht vollständig ist, dann eine .load() Handler wie folgt installieren:

CSS:

/* use some more specific selector than this */ 
li {display: none;} 

jQuery:

$("li img").each(function() { 
    if (this.complete) { 
     // img already loaded successfully, show it 
     $(this).closest("li").show(); 
    } else { 
     // not loaded yet so install a .load handler to see if it loads 
     $(this).load(function() { 
      // loaded successfully so show it 
      $(this).closest("li").show(); 
     }); 
    } 
}); 
+0

Macht vollkommen Sinn und ich lernte etwas Neues. Vielen Dank! – Chris

+0

@Chris - Ich habe auch eine andere Lösung hinzugefügt, aber ich denke, die erste ist einfacher. – jfriend00

+0

Oh, du kannst das !? Sehr cool @ jfriend00. Vielen Dank! – Chris

0

In jQuery gibt es .error Event-Handler http://api.jquery.com/error/.

Beispiel:

$('img').error(function(event) { 
    $(this).closest('li').hide();  

}); 
+0

Mehrere Probleme damit.1) Dies wird nur die erste IMG behandeln, die einen Fehler hat. 2) 'this' ist kein jQuery-Objekt. 3) Es können Fehler auftreten, bevor Sie Ihre jQuery ausführen können, um den Fehlerhandler zu installieren. – jfriend00

+0

@ jfriend00 ich habe es geändert. – KrishnaDhungana

+0

@KrishnaDhungana danke für Ihre Zeit zu diesem Thema. – Chris

0

jQuery verwenden können Sie Ihre <li> nur gesetzt, wenn die <img> Lasten zu laden. Read along here.

HTML beginnt wie:

<li style="display: none;"><a href='http://www.so.com'><img src='http://www.so.com/1.jpg' id="imgOne" class="imgSet"></a></li> 

Entweder es eine Klasse geben, wenn sie Teil einer Gruppe ist, eine ID, wenn es sehr spezifisch ist, und Sie wollen nur, dass ein oder wählen Sie alle Bilder auf der Seite, wenn Sie wollen. In meinem Beispiel verwende ich die Klasse, um sie als Gruppe auszuwählen.

jQuery:

$('.imgSet').load(function() { 
    $(this).parents('li').show(); 
}); 

Im Grunde ist es, bis das Bild geladen versteckt ist.

+0

Das Bild kann sehr gut geladen werden, bevor Sie Ihren '.load()' - Handler anhängen (wie wenn das Bild im Cache ist), so dass Sie das load-Ereignis verpassen würden. – jfriend00

+0

Ich denke, er will nur sicher sein, nicht versehentlich einen zusätzlichen Aufzählungspunkt zu laden, falls es kein Bild gibt – Deryck

+0

@Deryck - Das ist meine Schuld, weil es nicht klar genug ist. Es gibt keine Aufzählungspunkte, aber danke, dass du das gezeigt hast, sehr interessant. – Chris