2011-09-23 9 views
6

Mam następujący kod, emulując kliknięcie lewym lub prawym klawiszem w dół zdarzeń. Jest stosowany jako część galerii pokaz slajdów:Jak ustalić, czy element jest ostatnim lub pierwszym dzieckiem rodzica w javascript/jquery?

$(document).keydown(function (e) { 
        if(e.keyCode == 37) { // left 
         $(".thumb-selected").prev().trigger('click'); 
        } 
        else if(e.keyCode == 39) { // right 
         $("thumb-selected").next().trigger('click'); 
        } 
       }); 

Zasadniczo Znalazło następnego lub poprzedniego rodzeństwa (w zależności od wciśniętego klawisza) i wywołać zdarzenie click, które będą z kolei wyświetli odpowiedni obraz w galerii. Te obrazy są przechowywane na nieuporządkowanej liście.

Miejsce, w którym jestem zaskoczony, to to, że po wybraniu pierwszego lub ostatniego obrazu i kliknięciu lewego lub prawego przycisku (odpowiednio), chcę, aby uzyskać następne zdjęcie na drugim końcu listy obrazów. Na przykład, jeśli pierwsze zdjęcie zostanie wybrane i naciśnięta zostanie lewa strzałka; biorąc pod uwagę, że nie ma poprzedniego obrazu (lub li elementu), otrzyma on ostatni obraz z listy. W ten sposób klawisze nigdy nie tracą funkcjonalności.

Czy w jquery znajduje się funkcja, która sprawdzi, czy obecny element jest pierwszym lub ostatnim dzieckiem jego jednostki nadrzędnej, lub zwróci indeks względem swojego elementu nadrzędnego, aby móc porównać jego indeks z rozmiarem()) jego elementu macierzystego?

+0

Można zwrócić się do obiektu nadrzędnego co pierwsze/ostatnie dzieci były i porównać z bieżącego elementu. Brak pomysłu na wydajność. –

+0

Wydajność nie jest problemem. Z tego, co przeczytałem, niemożliwe jest porównanie dwóch elementów selektora (jako obiektów). Mogę spróbować porównać id, ale nie id są ustawione na elementach listy, które są automatycznie generowane przez skrypt. Próbuję zmodyfikować skrypt tak, jak to tylko możliwe. – Prusprus

Odpowiedz

1
var length = $('#images_container li').length; 
    if(e.keyCode == 37) { // left 
     if($('.thumb-selected').index() > 0) 
       $(".thumb-selected").prev().trigger('click'); 
     else 
       $('.thumb-container').eq(length-1).trigger('click'); 
    } 

    else if(e.keyCode == 39) { // right 
     if($('.thumb-selected').index() < length-1) 
      $("thumb-selected").next().trigger('click'); 
      else 
       $('.thumb-container').eq(0).trigger('click'); 
    } 

.thumb-container jest elementem dominującym wszystkie kciuki. Przynajmniej to, co dostałem z twojego kodu.

HTML

<ul class="thumb-container"> 
     <li>thumb</li> 
     <li>thumb</li> 
      . 
      . 
      . 
    </ul> 
+0

Tak, to jest struktura listy. Wywołanie indeksu() wydaje się działać. Spróbuję tego. – Prusprus

+0

To działało świetnie. Jedyną zmianą w moim kodzie jest to, że podczas wywoływania elementu li po drugiej stronie listy (gdy warunek jeśli się nie powiedzie), mój selektor to $ (". Li .thumb-container li") z prostym ostatnim() lub pierwszym(), aby wskazać odpowiedni element do uruchomienia. – Prusprus

2

Możesz użyć wartości index(), która zwraca indeks elementu lub możesz użyć funkcji prev() i next(), aby sprawdzić, czy jest jeszcze jeden element.

if(e.keyCode == 37) { // left 
    if($(".thumb-selected").prev().length > 0)){ 
     $(".thumb-selected").prev().trigger('click'); 
    }else{ 
     //no more elements      
     } 
} 
else if(e.keyCode == 39) { // right 
    if($(".thumb-selected").next().length > 0)){ 
     $(".thumb-selected").next().trigger('click'); 
    }else{ 
     //no more elements      
     } 
} 

EDIT - I uaktualniony kod, ponieważ to sprawia, że ​​więcej sensu używać next() i prev() zamiast nextAll() i prevAll()

+0

prevAll() wyglądał jak dobry pomysł, nie jestem pewien, dlaczego prev() byłoby lepiej, aby uzyskać długość. Niezależnie od tego, wydaje się, że nic nie działa (cały czas zwraca 0). Zacznę czytać w tej funkcji; poinformuje Cię, co znajdę. – Prusprus

+0

Co masz na myśli, że retunrs 0? Zajrzyj tutaj (http://jsfiddle.net/NkWRK/) lub pokaż nam swoje oznaczenia. prev() i next() są lepsze, ponieważ patrzę tylko na jeden element, są szybsze –

3

Można użyć metody is()[docs] do testu:

if($(".thumb-selected").is(':first-child')) { 
    // whatever 
} else if($(".thumb-selected").is(':last-child')) { 
    // whatever 
} 
Powiązane problemy