2012-02-09 14 views
6

Estoy tratando de hacer algo si un div contiene un elemento determinado, pero parece que no puede desencadenar la condición. Aquí está mi mejor oportunidad.Prueba si un div no tiene un elemento

<div class='test'> 
    testing123 
</div> 

<div class='test'> 
    <p>testing456</p> 
</div> 

$('.test').each(function(){ 
    if(!$(this).has('p')) { 
     $(this).addClass('red'); 
    } 
}); 

el script se dirige a absolutamente todo. Aquí es un violín en vivo - http://jsbin.com/igoyuk/edit#javascript,html,live

Respuesta

11

Tenga en cuenta que .has()devuelve jQuery, no es un booleano!

.Tiene (selector) Devuelve: jQuery
Descripción: Reducir el conjunto de elementos emparejados a los que tienen un descendiente que coincide con el selector o elemento de DOM.

Hacer if(!$(this).has('p')) es siempre cierto, ya que jQuery siempre devuelve un conjunto, incluso si está vacío.

.has() básicamente filtra el conjunto está llamada, por lo que sólo tiene que hacer:

$('.test').has('p').addClass('red'); 
+0

Eso es genial, ¿cómo puedo hacer lo contrario, es decir, 'no tiene' p? gracias – SparrwHawk

+2

Me gusta esto por ejemplo: '$ ('. test: not (: has (p))')' –

+0

Brillante, obtuviste el voto porque me explicaste por qué no funcionó :-) ¡Gracias! – SparrwHawk

3
if (!($(this).find('p').length > 0)) { 
    $(this).addClass('red'); 
} 
0

podría utilizar la siguiente condición para comprobar la ausencia de un tipo de elemento:

if($('p', $(this)).length == 0) 

Desde $('p', $(this)) implica que todos los p elementos dentro de la actual elemento.

2

considere los siguientes productos: solamente

$("div.test:has(p)").addClass("red"); 

Este consultas el DOM para <div> elementos, seleccionando aquellos con la clase de prueba y luego mira si tiene un elemento <p/>. Es un poco más escueto = menos bytes pasando por el cable.

Cuestiones relacionadas