Problem
Jeśli spojrzeć na documentation dla .next(selector)
, to nie „znaleźć” następny rodzeństwo pasujący do selektora. Raczej patrzy na TYLKO następnego rodzeństwa i TYLKO zwraca ten element, jeśli pasuje do selektora, który nie jest tym, czego potrzebujesz.
Oto co mówi doc dla .next()
:
Opis: Pobierz bezpośrednio po rodzeństwo każdego elementu w zestaw dopasowanych elementów. Jeśli dostarczony jest selektor, pobiera następnego rodzeństwa tylko wtedy, gdy pasuje do tego selektora.
Tak, można zobaczyć, że .next(".box")
będzie wyglądać na elemencie h2
że bezpośrednio po elemencie .arrow
(to kolejny element rodzeństwo), a następnie porównać go do selektora .box
a ponieważ nie pasują do siebie, to będzie zwraca pusty obiekt jQuery.
rozwiązanie Korzystanie .nextAll()
Jeśli chcesz następny rodzeństwo pasujący do selektora, można użyć to:
$(this).nextAll(".box").eq(0).slideToggle();
to wyszukuje wszystkie rodzeństwo, które następują pasujące do selektora, a następnie wyodrębnia tylko pierwszy.
Utwórz własne.FindNext() Metoda
mam tak często zastanawiał się, dlaczego jQuery nie ma metody na to, że zrobiłem jeden siebie:
// get the next sibling that matches the selector
// only processes the first item in the passed in jQuery object
// designed to return a jQuery object containing 0 or 1 DOM elements
jQuery.fn.findNext = function(selector) {
return this.eq(0).nextAll(selector).eq(0);
}
I wtedy po prostu użyć:
$(this).findNext(".box").slideToggle();
Opcja: Dodaj więcej Structure do HTML, aby rzeczy prostsze i bardziej elastyczne
FYI, wspólne podejście do problemów, takich jak ten jest umieszczenie elementu div wokół każdego zestawu elementów DOM jak ten:
<div class="container">
<img class="arrow" src="images/navigation/arrowright.png">
<H2>More Information</H2>
<div class="box">
<h2>Bibendum Magna Lorem</h2>
<p>Cras mattis consectetur purus sit amet fermentum.</p>
</div>
</div>
<div class="container">
<img class="arrow" src="images/navigation/arrowright.png">
<H2>A Second Group of Information</H2>
<div class="box">
<h2>Bibendum Magna Lorem</h2>
<p>Cras mattis consectetur purus sit amet fermentum.</p>
</div>
</div>
Następnie można użyć kodu, który jest nieco mniej wrażliwe na dokładnym pozycjonowaniu elementy:
$(".arrow").click(function() {
$(this).closest(".container").find(".box").slideToggle();
});
Ten podchodzi do zawierającym i wspólnego rodzica przy użyciu .closest()
a następnie używa .find()
znaleźć element w tej grupie .box
.
FYI, wcięcie twojego HTML sprawia, że wygląda na to, że masz relacje rodzic/dziecko pomiędzy elementami, które w rzeczywistości nie istnieją (rodzaj mylącego sposobu na wyświetlanie HTML). – jfriend00
ah, tak, to ma sens, całkowicie moje złe! Jestem dość nowy, więc wciąż się do wszystkiego przyzwyczajam. Dzięki za wskazanie, że jesteś! – fjaxyu