2012-02-01 2 views
1

С помощью этого HTML:Нужна помощь счетные ChildNodes

<p id="child"><span id="grandchild"></span></p> 

И это JavaScript:

var x = document.getElementById("child").childNodes; 
console.log(x.length); 

я 1. С помощью этого HTML вместо:

<p id="child"><span id="grandchild">hi</span></p> 

я 1, а также. Я ожидал 2.

В первом фрагменте HTML я ожидал 1 из-за элемента span. Во втором фрагменте я ожидал 2, потому что есть не только элемент span, но и текстовый узел hi.

Что я не понимаю?

+0

Что вы получите за второй? Один? Три? –

+0

У меня есть один дочерний узел для каждой из первых двух строк. – user784637

+1

Я отредактировал ваш вопрос, чтобы, разумеется, устранить, что вы имели в виду. Правильно ли мое редактирование? – icktoofay

ответ

1

Детские узлы относятся только к прямым узлам под.

<p id ="child"><span id="grandchild">hi</span></p> //1 child node 

Only 1 child node is counted because "hi" is not a child of p#child it is the child of <span> 

Если вы хотите countall потомков вы должны сделать это рекурсивно, пожалуйста, смотрите ниже образца:

function countChild(p) 
{ 
    var ctr = p.childNodes.length; 
    for(var i=0;i<p.childNodes.length;i++) 
    {  
     ctr += countChild(p.childNodes[i]);  
    } 
    return ctr;  
} 
var x = document.getElementById("child"); 
alert(countChild(x)); 
+0

вам не нужна функция для этого, проверьте мой ответ http://stackoverflow.com/a/9090416/908879 – ajax333221

+0

на основе моего теста, getElementsByTagName вернет число элементов только с , это не будет считаться #text как «привет». – jerjer

+0

Я неправильно понял вопрос. Благодаря пояснению этого, я удалил свой ответ – ajax333221

0

Вы используете идентификаторы ненадлежащим образом. Вы хотите присвоить им классы, если вы считаете классы. Каждый идентификатор должен быть уникальным в DOM

Попробуйте что-то на мотив:

<p id ="child1"><span id="grandchild"></span></p> //1 child node 
<p id ="child2"><span id="grandchild">hi</span></p> //1 child node 

var x = document.getElementById("child2").childNodes; 
document.write(x.length); 
+0

Я уверен, что это не точная разметка DOM. –

+1

Первые две строки находятся на отдельных HTML-страницах. – icktoofay

+0

Откуда вы это знаете? – Tim

1

иерархии в первом примере выглядит следующим образом:

  • <p id="child">
    • <p id="grandchild">

Иерархия во втором примере выглядит следующим образом:

  • <p id="child">
    • <p id="grandchild">
      • текстовый узел: hi

childNodes содержит только прямых потомков, и каждый раз, только child является прямым ребенком grandchild.