2010-03-03 25 views
41

¿Existe alguna forma mejor de seleccionar elementos abuelos en jQuery para evitar esto?jQuery: selección de abuelos

$(this).parent().parent().parent().parent().parent().children(".title, .meta").fadeIn("fast"); 

Thanks.

+1

y qué hay de children(). Children(). Children(). Children (". Title")? – aneuryzm

+0

No pude resistir, puede usar $ (this) .gparent (2) con el código proporcionado en mi respuesta downvoted. No sé por qué está downvoted, ya que es la solución que responde a su pregunta ... – patrick

Respuesta

1

Uso del parents() selector para obtener todos los padres de un elemento. Luego puede buscar en la colección o iterar sobre ella si desea afectar a todos los antepasados.

20

Además de parents(), como ya han dicho, también debe check out closest(). Lea la comparación en la documentación allí, pero sus diferencias principales son que busca solo un resultado, e incluye $(this) en lo que busca (podría obtener lo que está buscando si no es lo suficientemente específico). Pros y contras.

5

Escribí este plugin simple porque pensé que tenía una selección de clase inequívoca en alguna parte que me daba errores. La selección de abuelos parecía más directa que $().parents() para este caso en particular.

Bueno, usé esto una vez y me di cuenta de que en realidad tenía un error de ortografía. No estoy seguro de lo útil que realmente es. $('myelem').gparent(2); te consigue el abuelo de 'myelem'.

(function($){ 
$.fn.gparent = function(recursion){ 
    if(recursion == undefined) recursion = 2; 
    if(typeof(recursion) == "number"){ 
     recursion = parseInt(recursion); 
     if(recursion > 0){ 
      gparent_holder = $(this); 
      for(var gparent_i = 0; gparent_i < recursion; gparent_i++){ 
       gparent_holder = gparent_holder.parent(); 
      } 
      return gparent_holder; 
     } 
     else return false; 
    } 
    else return false; 
} 
})(jQuery); 
+0

Me gusta esta solución. Estamos interesados ​​en jQuery> 2.0 y aún no existe una manera clara y directa de navegar por los niveles 'k'. Parece una cosa trivial para agregar al marco base. –

+0

bueno para traer recursividad. Una función recursiva es una gran solución para problemas como estos ... sin embargo, su solución no es recursiva. Publiqué un fragmento recursivo como respuesta a esta pregunta – patrick

0

@Femi tenía una respuesta a ello, y recursividad menciona, sin embargo, su solución no era recursiva, he aquí una solución recursiva jQuery para conseguir ancestros de un elemento:

$.fn.gparent = function(recursion){ 
    console.log('recursion: ' + recursion); 
    if(recursion > 1) return $(this).parent().gparent(recursion - 1); 
    return $(this).parent(); 
}; 

Si esta es tu HTML:

<div id='grandparent'> 
    <div id='parent'> 
    <div id='child'> 
     child 
    </div> 
    </div> 
</div> 

puede llamar

console.log($('#child').gparent(2)); 

para obtener el abuelo del elemento child. Here's the JSFiddle

+0

¿por qué se obtiene un voto negativo sin comentario ... es recursivo, está documentado, se proporciona un violín para mostrar que funciona, y es la respuesta a la pregunta del OP ... . SO debería hacer que sea imposible rechazarlo sin una explicación. ¡Ahora una solución que funciona perfectamente (que uso mucho!) No se muestra como válida ... – patrick

Cuestiones relacionadas