2011-06-30 14 views
14

Me pregunto cómo de la mejor manera puedo ver si un contenedor div contiene un elemento secundario. Tengo un evento de clic que se activa en un elemento secundario de cualquier div id = no leído o div id = read. Quiero verificar dónde está este niño.

Algo como esto es lo que estoy pensando:

if ($("#unread").find($(this))) 
    alert("unread"); 
else 
    alert("read"); 

Editar: $ (este) es una descendencia de dos niveles #unread o #read.

que respecta al uso

+0

posible duplicado de http://stackoverflow.com/ questions/648004/what-is-fastest-children-or-find-in-jquery – Vivek

Respuesta

15

Marca de: .children()

if($("#unread").children().length > 0) 
    alert("unread"); 
else 
    alert("read"); 

EDITAR

if($(event.target).closest('#unread').length > 0) 
    alert('unread'); 
else 
    alert('read'); 
+0

Oh, me olvidé de decir que $ (esto) es un descendiente dos niveles de #unread o #read. Por lo tanto, el padre del padre debe estar sin leer o leer – user822448

+0

Esto no funciona, ya que el clic $ (esto) es dos niveles de # no leído. Tampoco es el único hijo dos niveles de #unread. – user822448

2

Creo que sólo añadir .length debería funcionar:

if ($("#unread").find($(this)).length > 0) 
    alert("unread"); 
else 
    alert("read"); 
+0

Hay varios elementos secundarios que se ven como $ (esto), es decir dos niveles de #unread o #read. Por lo tanto, los niños no identificarán $ (esto), supongo. – user822448

+0

Esto no responde a la pregunta: el OP pregunta cómo verificar si un div es un (gran) hijo de otro, no solo para verificar si un div tiene algún hijo. – nnnnnn

+0

@ nnn- sí, ** ahora ** dice que –

2

Ir backwa RDS de $(this) para buscar #unread como un antepasado usando closest:

if($(this).closest('#unread').length > 0) 
    alert('unread'); 
else 
    alert('read'); 

Dependiendo de su estructura HTML, esto será más rápido que buscar todos los hijos de #unread encontrar this. Sin embargo, la diferencia de velocidad probablemente no importará mucho, pero debes tener en cuenta la opción de retroceder y los posibles beneficios de hacerlo.

La comprobación del antecesor podría ser una mejor opción para su intención también: tiene this en la mano y lo que realmente quiere saber es "¿está dentro de #unread?". Usar closest para volver al árbol DOM coincide exactamente con la pregunta que está haciendo.

Si por alguna razón usted está empeñado en a partir de las #unread y mirando a sus descendientes, a continuación, puede utilizar find:

if($('#unread').find(this)) 
    alert('unread'); 
else 
    alert('read'); 

Pero este enfoque sólo funcionará si está utilizando al menos jQuery 1.6.

+0

Ahí vamos! Esto funciona para el propósito. ¡Gracias! – user822448

2

Uso .closest() o .parents() a buscar el árbol del elemento hecho clic:

if ($(this).closest("#unread").length == 1) 
    // etc 

De lo contrario, ¿está usted interesado en un jQuery no contesta? Teniendo en cuenta que usted ha dicho el div con el evento de clic es exactamente dos niveles por debajo de los "leer" o "no leídos" divs que sólo podría hacer esto:

if (this.parentNode.parentNode.id === "unread") 
    alert("unread"); 
else 
    alert("read"); 

// or just alert(this.parentNode.parentNode.id); 
1

Me pregunto cómo de la mejor manera puede ver si un contenedor div contiene un elemento secundario.

Utilice $.contains(), especialmente si el rendimiento es una preocupación. De los documentos:

jQuery.contiene (contenedor, contenido)

devoluciones: Boolean

Descripción:Compruebe si un elemento DOM es un descendiente de otro elemento DOM.

es más eficiente que .find(), .children(), o .closest(), como otros han recomendado. Tenga en cuenta, sin embargo, que solo acepta los elementos DOM como parámetros, no los objetos jQuery (que es parte de por qué su rendimiento es mejor).

En su caso, se puede hacer esto en su controlador de eventos click:

if ($.contains($("#unread")[0], this)) { 
    alert("unread"); 
} else { 
    alert("read"); 
} 

EDIT: Al pensar en esto de nuevo, es probable que sea más intuitivo para buscar hacia arriba desde el elemento se ha hecho clic, en lugar de hacia abajo desde el elemento padre, y el rendimiento normalmente no sería una preocupación en un controlador de eventos click. Es decir, me gustaría optar por usar el método .closest() (según lo sugerido por @nnnnnn y @mu es demasiado corta), por lo que mi controlador de eventos click contendría:

if ($(this).closest("#unread").length > 0) { 
    alert("unread"); 
} else { 
    alert("read"); 
} 
Cuestiones relacionadas