2009-04-13 11 views
14

empty selector dice que: Coincide con todos los elementos que no tienen hijos (incluidos los nodos de texto).
Encuentra todos los elementos que están vacíos, no tienen elementos secundarios o texto.

Lo que quiero es obtener elementos que no tengan hijos pero que puedan tener texto adentro. ¿Cómo?Cómo obtener elementos que no tienen hijos, pero pueden tener texto?



ACTUALIZACIÓN:
Ejemplo:
quiero seleccionar estos elementos que no tiene hijos, pero pueden tener texto, con una sintaxis como esta:

$('div:empty, a:empty, span, p:empty, td:empty, img, input').mousemove(myMouseOverHandler); 

Respuesta

27

Obtener cualquier elemento que no tiene ningún otro elemento:

$('*:not(:has(*))'); 
+3

Puede valer la pena mencionar que esto no funciona al revés: "*: has (: not (*))" falla por alguna razón interna. – Borgar

+1

Tiene sentido si piensa en cómo un motor de selector de CSS podría estar tratando de interpretar los selectores. 'has' no debería ser consciente de cómo manejar' not'. Mejor aún, ¿qué demonios '' no (*) 'siquiera significaría? ¿Cómo se traduciría esto a lo que queremos? En cualquier caso, esta respuesta es increíble porque me salvó el tocino. –

19

Si un elemento tiene solamente texto, children() tendrá una longitud de 0:

<div id="test1"> 
Hello World 
</div> 

<div id="test2"> 
<b>Hey there</b> 
</div> 

<script> 
alert($("#test1").children().length); // alerts 0 
alert($("#test2").children().length); // alerts 1 (the bold tag) 
</script> 

EDITAR: En respuesta a su edición, jQuery es lo suficientemente impresionante para dejar que hagas filtros personalizados:

$.expr[':'].emptyOrText = function(e) { 
    return $(e).children().length == 0; 
}; 

Por lo tanto, utilizando el anterior contra el código HTML anterior, se puede hacer esto:

$('div:emptyOrText'); // will select #test1 
+1

Supongo que está buscando algo así como un selector ": sólo texto". El método children() solo ayuda si tienes el id. – kgiannakakis

+0

Sí, actualicé mi respuesta para mostrar cómo hacerlo. –

+0

¡Buen toque con el selector personalizado! Sin embargo, no es necesario usar el método 'extender' - solo haga jQuery.expr [':]. EmptyOrText = function() {...} – James

3

me hizo una JAVAS puros función de cript para cualquier persona que no quiera usar jQuery.

const getElementsWithNoChildren = (target) => { 
    let candidates; 

    if (target && typeof target.querySelectorAll === 'function') { 
     candidates = target.querySelectorAll('*'); 
    } 
    else if (target && typeof target.length === 'number') { 
     candidates = target; 
    } 
    else { 
     candidates = document.querySelectorAll('*'); 
    } 

    return Array.from(candidates).filter((elem) => { 
     return elem.children.length === 0; 
    }); 
}; 
Cuestiones relacionadas