2012-07-20 18 views
5

Angenommen, ich habe eine <dl> mit allen <dd> s ausgeblendet. Ein Klick auf ein <dt> schaltet die <dd> s, die es mit dem folgenden Code folgen:Wie wähle ich Geschwister() aus mehreren Elementen?

$(this).nextUntil('dt').toggle(); 

http://jsfiddle.net/mblase75/FZQj7/

Nun, ich möchte die <dd> s im Anschluss an die anderen <dt> s automatisch verstecken, so dass ich versuchen, das packen Geschwister mit diesem Code:

$(this).nextUntil('dt').toggle() 
    .siblings().filter('dd').hide(); 

http://jsfiddle.net/mblase75/FZQj7/1/

Aber nichts passiert, weil jeder <dd> ich bereits mit .nextUntil ausgewählt habe ist ein Geschwister zueinander. Infolgedessen sind sie alle versteckt und nichts wird gezeigt.

Es muss eine kompakte Möglichkeit geben, jQuery anzuweisen, alle Geschwister auszuwählen, AUSSER denen, die ich bereits ausgewählt habe, aber ich kann es nicht sehen. Ideen?

Antwort

2

Man konnte es von der Mutter tun:

$('dt').on('click',function() { 
    $(this).nextUntil('dt').toggle().siblings("dt").not(this).nextUntil('dt').hide(); 
});​ 

http://jsfiddle.net/FZQj7/7/

+0

Clever seitwärts denken. Übrigens können Sie '.parent(). Find (" dt ")' zu 'Geschwister ('dt')' verkürzen, was ich nicht bemerkt habe, bevor lbstr es getan hat. – Blazemonger

+0

@Blazemonger Es würde mehr als nur diese beiden Methoden zu .siblings() ändern, http://jsfiddle.net/FZQj7/13/ –

+0

Dies ist die Lösung, die ich verwende: http://jsfiddle.net/mblase75/FZQj7/14/- wegen seiner Eleganz und der Einlinienverkettung den anderen vorzuziehen. – Blazemonger

3

Wie wäre es damit? Beachten Sie die Verwendung der Funktion not, which you can read about here.

http://jsfiddle.net/lbstr/FZQj7/6/

$('dt').on('click',function() { 
    var $this = $(this), 
     $firstGroup = $this.nextUntil('dt'); 
    $firstGroup.toggle(); 
    $this.siblings('dd').not($firstGroup).hide(); 
});​ 
+0

Ja, nur, dass ich herausgefunden. War im Begriff, es zu veröffentlichen, aber Sie haben mich dazu geschlagen. – Blazemonger

+0

@Blazemonger Ich mache das die ganze Zeit! Nur ein Gedanke ... Macht es in deinem Fall Sinn, alle "dd" - und "dt" -Elemente Geschwister zu haben? Es scheint, als ob es syntaktisch sinnvoller wäre, sie in ihre eigenen 'dl's zu gruppieren. Und es würde dieses Problem viel leichter zu lösen machen. – lbstr

+0

Nun, ich zeige und verstecke Tabellenzeilen - ich habe eine Definitionsliste nur für das Beispiel verwendet, weil es einfacher ist. – Blazemonger

1

Eine einfache Lösung ist es, Ihnen zeigen eine Klasse auf die Elemente anzuwenden. Mit jedem Klick können Sie die Elemente mit dieser Klasse ausblenden, bevor Sie die gewünschte Menge anzeigen.

http://jsfiddle.net/FZQj7/11/

$('dt').on('click',function() { 
    $('.visibledd').hide().removeClass('visibledd'); 
    $(this) 
     .nextUntil('dt') 
     .toggle() 
     .addClass('visibledd'); 
});​ 
+0

Ich mag diese Idee, aber es wird nicht zulassen, dass Sie die 'dd' Gruppe zusammenbrechen, indem Sie erneut auf' dt' klicken. – lbstr

0

Hier ist etwas ein wenig einfacher als diese anderen:

$('dt').on('click',function() { 
    $(this).siblings('dd').hide(); 
    $(this).nextUntil('dt').show(); 
}); 
+0

Das geht nicht, denn dann kann ich nicht alle '

's mit einem zweiten Klick auf'
'verstecken. – Blazemonger

+0

Entschuldigung. scheint ich die Anforderung missverstanden ... – ShaneBlake

Verwandte Themen