2008-10-28 11 views
7

Me gustaría verificar el ancestro utilizando dos objetos jQuery. No tienen ID, y solo estarán disponibles como objetos jQuery (o nodos DOM si llamaste al get()). jQuery de is() sólo funciona con las expresiones, por lo que este código sería lo ideal, pero no va a funcionar:antepasados ​​de jQuery que usan objetos jQuery

var someDiv = $('#div'); 

$('a').click(function() { 
    if ($(this).parents().is(someDiv)) { 
     alert('boo'); 
    } 
} 

que desea es ver si un elemento es un hijo de otro y me gustaría evitar retroceder en DOM tierra si posible.

Respuesta

12

Puede utilizar el método index() para comprobar si un elemento existe en una lista, por lo que el siguiente trabajo?

var someDiv = $('#div'); 

$('a').click(function() { 
    if ($(this).parents().index(someDiv) >= 0) { 
     alert('boo'); 
    } 
} 

De #index reference.

+0

perfecto Gareth, gracias! Te votaré, pero mi escasa puntuación de reputación 11 me prohíbe hacerlo. – MichaelThompson

1

lo largo de esas líneas, los padres() acepta opcionalmente un selector sí:

$('a').click(function() { 
    if ($(this).parents("#div").length) { 
    alert('boo'); 
    } 
}); 
+0

.parents() solo acepta los selectores más básicos (es decir, solo los selectores que describan un único elemento funcionarán, no los selectores que describan ancetry como "p strong"). –

+0

Sin embargo, funciona bien para lo que intenta hacer. –

+0

Simplifiqué un poco mi ejemplo, por lo que en el código real obtengo el objeto padre usando referencias jQuery almacenadas en lugar de selectores de cadenas. – MichaelThompson

0

Una forma sería utilizar la función de filtro

$('a').click(function() { 
    $(this).parents().filter(function() { 
     return this == someDiv[0]; 
    }).each(function() { 
     alert('foo'); 
    }) 
} 

Creo que también puede ser capaz de alejarse con el uso de jQuery.inArray

if ($.inArray(someDiv, $(this).parents())) { 
     alert('boo'); 
} 
0

¿le no obtener el resultado que quieres de un simple uso de CSS se ¿lector?

$('#div a').click(function() { ... }); 
10

Comprobación de (this).parents().index(someDiv) >= 0, como sugiere @Gareth, funcionará bien.

Sin embargo, usando el jQuery ancestry plugin es manera más rápida/más eficiente.

+0

¡Gracias! El plugin de ancestros y los métodos DOM son considerablemente más rápidos. – MichaelThompson

+1

¿Qué hay de darnos un voto entonces? ;-) –

0

Prueba esto:

var someDiv = $('#div'); 

$('a').click(function() { 
    if ($.inArray($(this).parents().get(), someDiv.get(0)) { 
     alert('boo'); 
    } 
} 
0
var $element = $('a'); 
while ($element && !$element.is('someDiv')) { 
    var $element = $element.parent(); 
}; 
Cuestiones relacionadas