2012-07-20 10 views
5

Powiedz, że mam <dl> z ukrytymi wszystkimi <dd>. Kliknięcie <dt> przełącza <dd> s, które następują go za pomocą następującego kodu:Jak wybrać rodzeństwo() z wielu elementów?

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

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

Teraz chcę, aby automatycznie ukryć <dd> s po innych <dt> s, więc staram się chwycić rodzeństwo z tym kodem:

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

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

Ale nic się nie dzieje, ponieważ każdy <dd> już wybrałem z .nextUntil jest rodzeństwem dla siebie. W rezultacie wszystkie są ukryte i nic się nie pokazuje.

Musi być zwarty sposób, aby powiedzieć jQuery, aby wybrała wszystkie rodzeństwo, Z WYJĄTKIEM tych, które już wybrałem, ale nie widzę tego. Pomysły?

Odpowiedz

2

Można to zrobić od rodzica:

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

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

+0

Sprytne myślenie lateralne tam. Nawiasem mówiąc, możesz skrócić '.parent(). Find (" dt ")' do 'siblings ('dt')', którego nie zdawałem sobie sprawy zanim zrobi to lbstr. – Blazemonger

+0

@Blazemonger To by było więcej niż tylko zmiana tych dwóch metod na .siblings(), http://jsfiddle.net/FZQj7/13/ –

+0

To jest rozwiązanie, którego używam: http://jsfiddle.net/mblase75/FZQj7/14/- preferowane w stosunku do innych ze względu na elegancję i jednopoziomowe łańcuchy. – Blazemonger

3

Co powiesz na to? Zwróć uwagę na użycie funkcji 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

Tak, po prostu pomyślałem, że się sam. Miałem właśnie to opublikować, ale mnie do tego przekonałeś. – Blazemonger

+0

@Blazemonger robię to przez cały czas! Tylko myśl ... Czy ma to sens w twoim przypadku, aby wszystkie elementy 'dd' i' dt' były rodzeństwem? Wydaje się, że może to mieć więcej sensu w sensie syntaktycznym, aby można je było pogrupować w swoje własne 'dl's. A to sprawiłoby, że problem ten byłby łatwiejszy do rozwiązania. – lbstr

+0

Cóż, faktycznie pokazywam i ukrywam wiersze tabeli - użyłem listy definicji tylko dla przykładu, ponieważ jest to prostszy kod. – Blazemonger

1

Prostym rozwiązaniem jest zastosowanie klasę elementów pokażesz. Przy każdym kliknięciu możesz ukryć elementy w tej klasie przed wyświetleniem odpowiedniego zestawu.

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

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

Podoba mi się ten pomysł, ale nie pozwoli ci zwinąć grupy 'dd' klikając ponownie na jej' dt'. – lbstr

0

Oto coś trochę prostsze niż tych innych:

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

Nie zrobię tego, ponieważ wtedy nie mogę ukryć wszystkich '

' s za pomocą drugiego kliknięcia na tym samym '
'. – Blazemonger

+0

Przepraszam. wydaje się, że źle zrozumiałem wymóg ... – ShaneBlake

Powiązane problemy