2011-09-23 22 views
6

Tengo el siguiente código, que emula un clic en los eventos de tecla abajo a la izquierda o a la derecha. Esto se utiliza como parte de una presentación de diapositivas galería:Cómo determinar si el elemento es el último o el primer elemento secundario de los elementos principales en 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'); 
        } 
       }); 

Esencialmente se recoge la siguiente o anterior de hermanos (dependiendo de la tecla pulsada) y llamar al evento click que a su vez mostrar la imagen apropiada en la galería. Estas imágenes están todas almacenadas en una lista desordenada.

Donde estoy perplejo es que cuando se selecciona la primera o la última imagen y se presiona el botón izquierdo o derecho (respectivamente), quiero que aparezca la siguiente imagen en el extremo opuesto de la lista de imágenes. Por ejemplo, si se selecciona la primera imagen y se presiona la flecha hacia la izquierda; dado que no hay una imagen previa (o elemento li), obtendrá la última imagen en la lista. De esta forma, las teclas nunca pierden funcionalidad.

Hay una función en jquery que verificará si el elemento presente es el primero o el último hijo de su elemento primario, o devolverá su índice relativo a su elemento primario para que pueda comparar su índice con el tamaño() (número de hijos) de su elemento padre?

+0

Se podría pedir al objeto padre lo fueron el primer/último los niños y comparar con el elemento actual. No tengo idea de rendimiento. –

+0

El rendimiento no es un problema. Por lo que he leído, es imposible comparar dos elementos de selector (como objetos). Podría intentar comparar las identificaciones, pero no se establecen identificadores en los elementos de la lista, que el guión genera automáticamente. Estoy tratando de modificar la secuencia de comandos lo menos posible. – Prusprus

Respuesta

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 es el elemento principal de la todos los pulgares. Al menos lo que obtuve de tu código.

HTML

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

Sí, esa es la estructura de la lista. La llamada de índice() parece funcionar. Voy a intentar esto. – Prusprus

+0

Esto funcionó muy bien. La única variación en mi código es que cuando llamo al elemento li del otro lado de la lista (cuando los condicionales if fallan), mi selector es $ (".li.thumb-container li") con un simple last() o first() función para señalar el elemento correcto para activar. – Prusprus

2

Puede usar index() que devuelve el índice del elemento o puede usar prev() y next() para verificar si hay un elemento más.

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      
     } 
} 

EDITAR - He actualizado el código, ya que hace más sentido usar next() y prev() en lugar de nextAll() y prevAll()

+0

prevAll() parecía una buena idea, no estoy seguro de por qué prev() sería mejor obtener la longitud. De todos modos, ninguno parece funcionar (devuelve 0 todo el tiempo). Comenzaré a leer esta función; Te dejaré saber lo que encuentro. – Prusprus

+0

¿Qué quiere decir con "retunrs" ​​0? Mire aquí (http://jsfiddle.net/NkWRK/) o muéstrenos su marca. prev() y next() son mejores porque solo miro un elemento, son más rápidos –

3

Usted puede utilizar el método is()[docs] a prueba:

if($(".thumb-selected").is(':first-child')) { 
    // whatever 
} else if($(".thumb-selected").is(':last-child')) { 
    // whatever 
} 
Cuestiones relacionadas