2010-02-22 14 views
129

aquí está el código HTML en bruto llego a trabajar con:jQuery encontrar más cercano hermano anterior con la clase

<li class="par_cat"></li> 
<li class="sub_cat"></li> 
<li class="sub_cat"></li> 
<li class="par_cat"></li> // this is the single element I need to select 
<li class="sub_cat"></li> 
<li class="sub_cat"></li> 
<li class="sub_cat current_sub"></li> // this is where I need to start searching 
<li class="par_cat"></li> 
<li class="sub_cat"></li> 
<li class="par_cat"></li> 

tengo que recorrer desde el .current_sub, encontrar el más cercano anterior .par_cat y hacer cosas a ella.

.find("li.par_cat") devuelve la carga completa de .par_cat (tengo alrededor de 30 en la página). Necesito apuntar el único.

Realmente agradecería algún consejo :)

+4

¡Guau, los gatos realmente están en Internet! Ahora también tenemos par gatos y sub gatos. –

Respuesta

225

Probar:

$('li.current_sub').prevAll("li.par_cat:first"); 

Probado con su margen de beneficio:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo"); 

llenará el más cercano anterior li.par_cat con "Woohoo".

+0

gracias Karim. Esto funcionó bien también, pero supongo que el .prev() consumiría menos recursos, ya que .prevAll obtendría TODOS los elementos coincidentes anteriores y luego filtraría el que necesito. Aceptando la respuesta de Ed. – daulex

+3

En realidad, después de un poco de mensajes de texto, el .prev() falló en algunas instancias. .prevTodos con: primero, funcionó todo el tiempo. Gracias. – daulex

+1

.prev() solo verifica el elemento inmediatamente anterior. Agregué el comentario a la respuesta a continuación junto con el ejemplo de jsFiddle. Después de mirar a su alrededor, esta es la mejor respuesta, ya que aunque tiene que desplazarse por todos los elementos, no requiere dos funciones para tomar todo y luego filtrar para encontrarlo. –

18

Trate

$('li.current_sub').prev('.par_cat').[do stuff]; 

+0

doh, funcionó a la perfección, eso fue mucho más fácil de lo que pensaba. Gracias. – daulex

+0

No hay problema: todos tenemos esos momentos;) –

+15

Espera, ¿qué? ¿Esto no solo verifica el elemento inmediatamente anterior? Por lo tanto, su código devolvería nulo?- Aquí está probado en jsFiddle: http://jsfiddle.net/Y2TEH/ –

10

Usando prevUntil() nos permitirá llegar a un hermano lejano sin tener que obtener toda. Tenía un conjunto particularmente largo que era demasiado intensivo de CPU usando prevAll().

var category = $('li.current_sub').prev('li.par_cat'); 
if (category.length == 0){ 
    category = $('li.current_sub').prevUntil('li.par_cat').last().prev(); 
} 
category.show(); 

Esto consigue el primer hermano precedente si coincide, de lo contrario se pone el hermano inmediatamente anterior a aquél que coincide, por lo que acaba de regresar un más con prev() para obtener el elemento deseado.

3

Creo que todas las respuestas carecen de algo. Yo prefiero usar algo como esto

$('li.current_sub').prevUntil("li.par_cat").prev(); 

ahorra no añadir: en primer lugar dentro del selector y es más fácil de leer y entender. El método prevUntil() tiene un mejor rendimiento en lugar de utilizar prevAll()

Cuestiones relacionadas