Pregunta simple, tengo un elemento que estoy agarrando .getElementById ()
. ¿Cómo verifico si tiene hijos?
fuente
Pregunta simple, tengo un elemento que estoy agarrando .getElementById ()
. ¿Cómo verifico si tiene hijos?
Un par de formas:
if (element.firstChild) {
// It has at least one
}
o la hasChildNodes()
función:
if (element.hasChildNodes()) {
// It has at least one
}
o length
propiedad de childNodes
:
if (element.childNodes.length > 0) { // Or just `if (element.childNodes.length)`
// It has at least one
}
Si solo desea conocer los elementos secundarios (a diferencia de los nodos de texto, nodos de atributos, etc.) en todos los navegadores modernos (e IE8, de hecho, incluso IE6) puede hacer esto: (¡gracias Florian !)
if (element.children.length > 0) { // Or just `if (element.children.length)`
// It has at least one element as a child
}
Que se basa en la children
propiedad, que no estaba definido en DOM1 , DOM2 , o DOM3 , pero que cuenta con el apoyo casi universal. (Funciona en IE6 y versiones posteriores y Chrome, Firefox y Opera al menos desde noviembre de 2012, cuando se escribió originalmente). Si es compatible con dispositivos móviles más antiguos, asegúrese de buscar soporte.
Si no necesita IE8 y soporte anterior, también puede hacer esto:
if (element.firstElementChild) {
// It has at least one element as a child
}
Eso depende firstElementChild
. Por children
ejemplo, tampoco se definió en DOM1-3, pero a diferencia de children
esto, no se agregó a IE hasta IE9.
Si desea ceñirse a algo definido en DOM1 (tal vez tenga que admitir navegadores realmente oscuros), debe trabajar más:
var hasChildElements, child;
hasChildElements = false;
for (child = element.firstChild; child; child = child.nextSibling) {
if (child.nodeType == 1) { // 1 == Element
hasChildElements = true;
break;
}
}
Todo eso es parte de DOM1 y tiene soporte casi universal.
Sería fácil resumir esto en una función, por ejemplo:
function hasChildElement(elm) {
var child, rv;
if (elm.children) {
// Supports `children`
rv = elm.children.length !== 0;
} else {
// The hard way...
rv = false;
for (child = element.firstChild; !rv && child; child = child.nextSibling) {
if (child.nodeType == 1) { // 1 == Element
rv = true;
}
}
}
return rv;
}
children
solo se agregó en DOM4. Sabiendo que era compatible con cualquier navegador conocido, pensé que era más o menos DOM0 / 1.div
elemento quediv
tenga una clase específicaxyz
?for (child = element.firstChild; child; child = child.nextSibling )
, votó. Gracias TJelement.firstChild
que no seanull
cuandoelement.children.length
es0
:firstChild
y esto se relaciona con nodos, incluidos elementos, nodos de texto, notas de comentarios, etc .;children
es puramente una lista de elementos secundarios. En los navegadores modernos, puede usarfirstElementChild
en su lugar.Como mencionan slashnick & bobince,
hasChildNodes()
devolverá verdadero para los espacios en blanco (nodos de texto). Sin embargo, no quería este comportamiento, y esto funcionó para mí :)Editar : para la misma funcionalidad, esta es una mejor solución:
children[]
es un subconjunto dechildNodes[]
, que contiene solo elementos.Compatibilidad
fuente
Puede verificar si el elemento tiene nodos secundarios
element.hasChildNodes()
. Tenga cuidado en Mozilla, esto devolverá verdadero si hay un espacio en blanco después de la etiqueta, por lo que deberá verificar el tipo de etiqueta.https://developer.mozilla.org/En/DOM/Node.hasChildNodes
fuente
También puede hacer lo siguiente:
Esto usa el método trim () para tratar los elementos vacíos que solo tienen espacios en blanco (en cuyo caso
hasChildNodes
devuelve verdadero) como si estuvieran vacíos.Demostración de JSBin
fuente
Tarde, pero el fragmento del documento podría ser un nodo:
Ver:
https://github.com/k-gun/so/blob/master/so.dom.js#L42
https://github.com/k-gun/so/blob/master/so.dom.js # L741
fuente
Pruebe la propiedad childElementCount :
fuente
Una
isEmpty( <selector> )
función reutilizable .También puede ejecutarlo hacia una colección de elementos (ver ejemplo)
devuelve
true
(y sale del bucle) tan pronto como un elemento tenga algún tipo de contenido al lado de espacios o líneas nuevas.fuente
fuente