2012-03-22 18 views
8

Aquí está mi violín: http://jsfiddle.net/jamesbrighton/wxWgG/4/jQuery seleccionar primer elemento que tiene una cierta clase después de este

HTML:

<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 


<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 

jQuery:

$('.click').click(function() { 
    $(this).nextAll('.target').css('color','red'); 
});​ 

lo necesito por lo que cuando se hace clic a p.click, el siguiente p.target se vuelve rojo.

Si hace clic en 'Click 1', 'Target 1' cambia a rojo. Si hace clic en 'Click 2', entonces 'Target 3' se vuelve rojo.

Así como .find He intentado .closest y de la documentación jQuery me parece que debería funcionar. Como puede ver en el HTML, .target no es un hijo de .click, en caso de que eso haga la diferencia.

+0

nextTodo funciona con los hermanos, no fuera de su padre. Entonces, debe decirnos cómo desea atravesar ... si quiere padres hijos, entonces es posible. –

+1

Su ejemplo no es muy bueno, solo contiene un elemento "Hacer clic". ¿Cómo se asocian "Click" y "Target"? ¿Están ambos en orden, es decir, si se hace clic en el segundo "clic", se debe resaltar el segundo "objetivo", etc.? * editar: * aparentemente tu vinculaste al violín incorrecto. Es por eso que siempre deberías incluir el código también. –

+0

No veo un 'Click 1' o un' Click 2'. ¿Tu código está actualizado? –

Respuesta

11

Aquí hay otro enfoque, aunque no sé cuán performante es .index() en este caso. Esto también supone que nunca hay dos .click elementos consecutivos (o expresado de otra manera: Siempre hay al menos un .target elemento entre dos .click elementos):

var $elements = $('.click, .target'); 

$('.click').click(function() { 
    $elements.eq($elements.index(this) + 1).css('color','red'); 
});​ 

DEMO

Esto funciona porque los elementos se seleccionan en el orden en que aparecen en el documento.

+1

Inteligente y agradable. –

0

You html construct no facilita el acceso hasta el objetivo específico. Podemos lograr lo que desee, pero el guión se complicará cuando atraviese de esa manera. En su lugar, agregue un div de agrupación que hará que la secuencia de comandos sea pequeña y fácil.

DEMO

HTML:

<div class="group"> <!-- added grouping wrapper --> 
<div> 
    <p class="click">Click 1</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 1</p> 
</div> 
<div> 
    <p class="target">Target 2</p> 
</div> 
</div> 
<div class="group"> 
<div> 
    <p class="click">Click 2</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
    <p>This should be ignored</p> 
</div> 

<div> 
    <p class="target">Target 3</p> 
</div> 
<div> 
    <p class="target">Target 4</p> 
</div> 
</div> 

JS:

$('.click').click(function() { 
    $(this).closest('.group').find('.target').css('color','red'); 
}); 

.nextAll trabaja en el hermano. En su caso, buscará a todos los hermanos de # click con la clase .target.

Lo que necesita es parents -> sibling -> child.

DEMO

$('#click').click(function() { 
    $(this).parent().siblings().find('.target').css('color','red'); 
}); 
+0

Solo el próximo' .target' debe ponerse rojo. Esto hace que todos los '.target' se vuelvan rojos – Ropstah

+0

Esto funciona, pero se rompe si agrego otro div alrededor del div que continúa p.click. Creo que entiendo por qué sucede esto, pero ¿hay alguna manera de encontrar el siguiente elemento con una determinada clase, independientemente de qué tan anidado esté? – Evans

0

Puede probar esto.

$('#click').click(function() { 
    var go = true; 

    var item = $(this).parent(); 

    while(go && item) { 
     var target = $('.target', item)[0]; 

     if(target != null) { 
      go = false; 
      $(target).css('color', 'red'); 
     } 

     item = $(item).next()[0]; 
    } 
});​ 
3

Esto selecciona los elementos que necesita en su código HTML:

$('.click').click(function() { 
    $(this).parent("div").next('div').find('.target').css('color','red'); 
});​ 
6

¿Está buscando para esto?

$('.click').click(function() { 
    $(".target", $(this).parent().next()).css('color','red'); 
}); 

Updated Fiddle

+0

Esto funciona, pero se rompe si agrego otro div alrededor del div que continúa p.click. Creo que entiendo por qué sucede esto, pero ¿hay alguna manera de encontrar el siguiente elemento con una determinada clase, independientemente de qué tan anidado esté? – Evans

+2

Su HTML debería tener una estructura fija o debe definir muy claramente qué casos desea cubrir. jQuery no puede leer la mente :) Mientras pueda definir el diseño, habría una manera, pero la definición debe ser consistente y precisa. –

1

Basado en el código HTML actualizado, he creado este violín: http://jsfiddle.net/wxWgG/22/

... y utilizado este jQuery

$('.click').click(function() { 
    $(this).parent().next().find('p.target').css('color','red'); 
});​ 

Es eso lo que querías?

+0

Esto funciona, pero se rompe si agrego otro div alrededor del div que continúa p.click. Creo que entiendo por qué sucede esto, pero ¿hay alguna manera de encontrar el siguiente elemento con una determinada clase, independientemente de qué tan anidado esté? – Evans

+0

¡Su HTML en el OP debe indicar el HTML con el que desea trabajar! Vea la respuesta de Félix Kling, parece que será una estructura agnóstica. De lo contrario, actualice el OP y espere otra serie de respuestas actualizadas ... – SpaceBison

Cuestiones relacionadas