2010-02-04 17 views
28

¿Es posible utilizar jQuery para seleccionar un antecesor de un elemento?jQuery seleccionar antecesor

de marcado:

<div id="ancestor-1"> 
    <div> 
     <a href="#" class="click-me">Click me</a> 
    </div> 
</div> 
<div id="ancestor-2"> 
    <div> 
     <a href="#" class="click-me">Click me</a> 
    </div> 
</div> 

Guión:

$(".click-me").click(function(){ 
    // var ancestorId = ???; 
    alert(ancestorId) 
}); 

Respuesta

0

¿Está buscando una parent()? jQuery Doc para el selector principal. Si es diferente para su escenario, explique cuál es su resultado esperado.

10

¿Quiere decir algo como esto?

$('.click-me').click(function() { 
    var $theAncestor = $(this).closest('#ancestor-1'); 
} 

Esto buscará a través de todos los antepasados ​​hasta que se encuentre una coincidencia.

http://api.jquery.com/closest/

EDIT:

Jerome, su pregunta se puede interpretar de varias maneras. Esto habla del poder y la flexibilidad de jQuery.

Por favor, considere lo siguiente.

Primero, para responder a su pregunta, sí, es posible utilizar jQuery para seleccionar un antecesor de un elemento.

creo que podemos asumir que son conscientes de la capacidad de jQuery para seleccionar cualquier elemento, ya sea ascendiente o descendiente a través de:

$('#myElement') 

Teniendo en cuenta el clic-me ejemplo, si le gustaría tener un conjunto de todos los antepasados ​​de un elemento devuelto, utilice:

$(this).parents() 

o

$(this).parents(selector) 

Pero tenga en cuenta que esto atravesará TODOS los antepasados ​​devolviéndolo todo, o todos los que coincidan cuando se entregue un selector.

Si desea tener el padre inmediato regresaron, utilice:

$(this).parent() 

Si sabe qué ancestro que necesita, utilice:

$(this).closest(selector) 

pero tenga en cuenta que sólo se devolverá el primera coincidencia, y si el elemento actual (esta) es una coincidencia, devolverá eso.

Espero que esto ayude.

+2

La diferencia entre 'parents()' y 'closest()' es sutil pero importante. 'closest()' devolverá el elemento actual si es una coincidencia; 'parents()' devuelve _only ancestros_. Muchos no quieren la posibilidad de devolver el elemento actual. 'closest()' también solo devuelve un elemento; 'parents()' devuelve todos los elementos coincidentes. –

+0

@Ryan - Mi respuesta fue específica a la pregunta. La pregunta sugiere una consulta para un ancestroID específico, en lugar de una consulta general sobre cuáles son los padres. Dada la naturaleza creciente de los identificadores ancestrales, parece que jerome puede intentar calcular la identidad del ancestro desde el contexto y solicitarla. – user113716

+0

Patrick, si Jerome intentaba calcular la identidad de antepasado del contexto, ** no hay absolutamente ningún punto ** en el uso de '$ (this) .closest ('# ancestor-1')' cuando '$ ('# ancestro-1 ') 'no solo sería suficiente sino también más rápido. A veces, es mejor leer las intenciones de una pregunta y dirigir la respuesta en consecuencia. –

43

Pruebe parent() para el elemento primario inmediato.

$(".click-me").click(function() { 
    var ancestor = $(this).parent(); 
    alert(ancestor) 
}); 

O parents() para todos los elementos antecesores juego.

$(".click-me").click(function() { 
    var ancestors = $(this).parents(".some-ancestor"); 
    alert(ancestors) 
}); 

O closest() para el elemento coincidente primero más cercano (ya sea un antepasado o por cuenta propia).

$(".click-me").click(function() { 
    var ancestor = $(this).closest(".some-ancestor"); 
    alert(ancestor) 
}); 

La diferencia entre parents() y closest() es sutil pero importante. closest() devolverá el elemento actual si coincide; parents() devuelve solo antepasados ​​. Muchos no quieren la posibilidad de devolver el elemento actual. closest() también solo devuelve un elemento; parents() devuelve todos los elementos coincidentes.

2

Trate de usar los padres (o) más cercano() en combinación, tal vez, con un selector para determinar qué ancestro debe coincidir. Por ejemplo, encuentre el antepasado div más cercano con una identificación.

$('.click-me').click(function() { 
     var ancestorId = $(this).closest('div[id]'); 
     alert(ancestorId); 
}); 
0

Realmente depende de lo que quiere lograr. ¿Desea buscar todos los antepasados ​​independientemente de la clase utilizada? ¿O desea buscar todos los elementos que son ancestros y tener cierta clase (ancestro-x en su caso)?

Si desea desplazarse a través de los antepasados, basta con utilizar .parent() (hay un excelente ejemplo de cómo desplazarse a través de todos los elementos) o .parents() la que se puede utilizar como:

$(".click-me").click(function(){ 
    var parentElements = $(this).parents().map(function() { 
     return this.tagName; 
    }) 
    // whatever else you want to do with it 
}); 

Probablemente el mejor enfoque sería use .parents() hasta que llegue al elemento con cierta identificación o clase. Realmente depende de lo que quieras hacer.