childNodes
иногда дает мне #text
элемент вместо <div>
<div class="first-div">
<div class="second-div">
<div class="third-div">1</div>
<div class="third-divs-sibling">2</div>
</div>
</div>
Когда я пытаюсь получить доступ к внукам, вот так:
var xxx = document.getElementsByClassName('first-div')[0];
console.log(xxx.childNodes[ 1 ].childNodes[ 1 ]);
console.log(xxx.childNodes[ 1 ].childNodes[ 2 ]);
Chrome дает мне это:
<div class="third-div">1</div>
#text
Вот JSFiddle
Сначала я думал, что он где-то нашел пробел, но console.log(xxx.childNodes[ 1 ])
возвращает только 3 узла. Похоже, это некрасивая магия для моего неподготовленного глаза.
Кто-нибудь имеет более научное объяснение?
Пробелы также создают текстовые узлы. Ваш #second-div
имеет фактически 5 детей, из которых только 2 являются элементами:
childNodes[0]
: разрыв строки между открывающим тегом и #third-div
childNodes[1]
: #third-div
childNodes[2]
: разрыв строки между #third-div
и #third-divs-sibling
childNodes[3]
: #third-divs-sibling
childNodes[4]
: разрыв строки между #third-divs-sibling
и закрывающим тегом Если вы ищете только элементы, вы можете использовать коллекцию .children
вместо .childNodes
.
Эти #text
являются TextNodes, которые также включают новые строки среди вкладок, пробелов. Помните, что Node.childNodes коллекция включает в себя TextNodes также. Если вы не хотите их, используйте Node.children, который является только набором узлов Element:
var xxx = document.getElementsByClassName('first-div')[0];
console.log(xxx.children[0].children[0]);
console.log(xxx.children[0].children[1]);
Я также вижу, что из-за этой путаницы вы предполагали, что элементы являются индексами от 1, а индексирование начинается с 0
.
Таким образом, внутренние значения также возвращаются как childNodes... index 3 даст второй div (с классом "third-divs-sibling") и index 4 его текстовым узлом.
xxx.childNodes[ 1 ].childNodes[ 1 ] => <div class="third-div">1</div>
xxx.childNodes[ 1 ].childNodes[ 2 ] => #text (1)
xxx.childNodes[ 1 ].childNodes[ 3 ] => <div class="third-divs-sibling">
xxx.childNodes[ 1 ].childNodes[ 4 ] => #text (2)
.first-div
действительно имеет 3 дочерних узла - два текстовых узла и.second-div