2011-06-15 12 views
15

En DOM JavaScript, childNodes.length devuelve el número de elementos y nodos de texto. ¿Hay alguna forma de contar solo el número de nodos secundarios solo para elementos?JavaScript DOM childNodes.length también devuelve el número de nodos de texto

Por ejemplo, childNodes.length de div#posts volverán 6, cuando esperaba 2:

<div id="posts"> 
    <!-- some comment --> 
    <!-- another comment --> 
    <div>an element node</div> 
    <!-- another comment --> 
    <span>an element node</span> 
    a text node 
</div> 
+1

posible duplicado de [element.firstChild está volviendo ' mplungjan

Respuesta

17

No directamente. Los nodos de texto (incluidos los comentarios, etc.) son nodos secundarios.

Su mejor opción es iterar sobre la matriz childNodes y contar solo los nodos con nodeType == Node.ELEMENT_NODE. (Y escriba una función para hacerlo).

+1

+1 misma longitud de onda, solo un poco más rápido :-) – andyb

+5

Las versiones anteriores de IE no exponen 'Constantes' Node', por lo que para compatibilidad necesitará usar el valor 'Node.ELEMENT_NODE' directamente, que es' 1'. –

+0

@Tim Down ¿Alguna idea de qué versión de IE comenzó a admitir estas constantes? (Digamos que solo quiero soportar IE7 o superior, ¿va a funcionar eso?) – mgiuca

3

Puede filtrar por Node.nodeType (la documentación de Mozilla porque creo que es un gran recurso).

+0

Por "filtro" ¿quiere decir simplemente iterar y contar, o hay realmente una manera rápida de filtrar por una determinada condición en JS que no conozco? – mgiuca

+0

Sí, simplemente filtre programáticamente, como sugirió en su respuesta. – andyb

2

Puede utilizar document.querySelectorAll('#posts > *'):

var children = document.querySelectorAll('#posts > *'); 
 
console.log('Number of children: ' + children.length);
<div id="posts"> 
 
    <!-- some comment --> 
 
    <!-- another comment --> 
 
    <div>an element node 
 
     <span>a grand-child node</span> 
 
    </div> 
 
    <!-- another comment --> 
 
    <span>an element node</span> 
 
    a text node 
 
</div>

Cuestiones relacionadas