2009-04-29 1 views
1

Ich möchte eine lange Liste kurz machen, indem Sie einige Elemente in langen Unterlisten ausblenden, ohne zusätzliche Verarbeitung auf der Serverseite hinzuzufügen. Das Problem ist, dass das Markup, das vom Server kommt, nicht von mir kontrolliert wird und nicht so gestaltet ist, dass meine Arbeit einfach ist. Hier ist der CodeAusblenden von zusätzlichen Elementen in einer Liste mit jQuery in einer kniffligen Situation (Markup ist nicht ideal)

<ul id="long-list"> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="header"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="item"></li> 
    <li class="header"></li> 
    <li class="item"></li> 
    . 
    . 
    . 
</ul> 

Wie Sie feststellen, die Header sind Geschwister zu den Elementen. Jetzt möchte ich einen jQuery-Code haben, der nach jeder Kopfzeile nur 3 Elemente anzeigt und den Rest ausblendet, um die Liste kürzer und brauchbarer zu machen.

Hier ist mein Versuch, die nicht Arbeits sind:

$('#long-list li.header ~ li.item:gt(3)').hide(); 
    $('#long-list li.header ~ li.item:lt(3)').show(); 
    $('#long-list li.header').show(); 

Die zusätzliche Funktion eines Knotens im Grunde jeden Abschnitts ist das Hinzufügen, die sagen: „5 ist Gegenstände versteckt, zu sagen, wie viele Elemente versteckt mehr ...“

Antwort

1

Dies ist, wie ich es implementiert habe. Beachten Sie, dass es weitere Funktionen wie das Hinzufügen eines Knotens am Ende von Unterlisten mit ausgeblendeten Elementen, das Ausblenden von x-Elementen und das Binden eines onclick-Ereignisses zum Umschalten verborgener Elemente enthält.

if ($('#list li.header')[0]) {  
     var i = -1000; 
     $("#list > li").each(function(){ 
     if ($(this).hasClass("header")) { 
      (i>3) && ($(this).before("<li class='more'>" + (i-3) + " more...</li>").bind("click", toggle_more()) ); 
      i = 0; 
     } 
     else { 
      i = i+1; 
     } 
     $(this).toggle(i<=3); 
     }); 
    } 

Es basiert im Wesentlichen auf dem oben genannten svinto. Ich suche immer noch nach einer besseren Leistung. Jedenfalls bin ich gerade mit den Ergebnissen zufrieden.

Das Initiieren von i mit -1000 stellt sicher, dass wir keine Einträge an der Spitze der Liste ausblenden, die keine Kopfzeile haben. Sobald wir einen Header erreichen, setzen wir das i auf Null und fangen an zu zählen.

3

könnte möglich sein, es besser zu machen, aber dies sollte funktionieren:

var i = 0; 
$("#long-list li.header:first").nextAll("li").each(function(){ 
    i = $(this).hasClass("header") ? 0 : i+1; 
    $(this).toggle(i<=3); 
}); 

(Aktualisiert keine Gegenstände vor dem ersten verstecken Header.)

+0

Vielen Dank, aber zuerst die Liste kann wirklich lang sein, dass das Durchschleifen jedes Elements könnte sogar moderne Browser zu Knie bringen ... Zweitens, wie ich im Beispielcode aufgeführt haben, am Anfang der Liste dort Alle Elemente, die keinem Header angehören, sollten nicht ausgeblendet werden. –

+1

Ich bezweifle, dass Sie in der Lage sein werden, dies zu tun, ohne die Elemente irgendwie durchzulaufen. Selbst wenn Sie es schaffen, etwas ohne explizite Schleife zu schreiben, wird es immer noch eine Schleife innerhalb von jQuery geben ... – svinto

+0

Ein Problem bei der Verwendung von .nextAll() ist, dass es einen anderen Header überschreiten kann, wenn weniger als 3 Elemente in einem Header sind. – Soviut

0

Sie können dies nicht ohne eine Schleife in Jquery tun.

0

Das scheint für mich zu funktionieren und scheint logisch der Absicht Ihres ursprünglichen Versuchs zu folgen, nur den Geschwisterselektor verwendend.

$("li.header:first").prevAll("li.item").hide(); 
    $("li.header").each(function() { 
    $(this).nextAll("li.item:lt(3)").show(); 
    $(this).nextAll("li.item:gt(3)").hide(); 
    }); 
Verwandte Themen