在 IE 瀏覽器中,childNodes 列表會將元素標籤之間的換行符解析為文字節點,導致索引位置與直覺不符;而 Firefox 則忽略這些空白文字節點,表現更符合開發者預期。
<div onclick="alert(this.childNodes[0].tagName)">
<span>span</span>
<pre>pre</pre>
<font>font</font>
</div>
| 索引 | IE 節點類型 | Firefox 節點類型 |
|---|---|---|
| 0 | SPAN (元素) | SPAN (元素) |
| 1 | #text (換行) | PRE (元素) |
| 2 | PRE (元素) | #text (換行) |
| 3 | #text (換行) | FONT (元素) |
| 4 | FONT (元素) | #text (換行) |
| 5 | #text (換行) | — |
childNodes 包含所有文字節點(含換行、縮排),元素節點索引為 0, 2, 4, 6…(等差數列,首項 0,公差 2)。// 僅取得元素節點,IE 支援 children 集合
var firstChild = element.children[0];
function getElementChildren(parent) {
var result = [];
for (var i = 0; i < parent.childNodes.length; i++) {
var node = parent.childNodes[i];
if (node.nodeType === 1) { // Node.ELEMENT_NODE
result.push(node);
}
}
return result;
}
// 使用
var elements = getElementChildren(div);
var firstEl = elements[0];
var firstEl = div.firstElementChild;
var lastEl = div.lastElementChild;
var allEls = div.children; // HTMLCollection,僅含元素節點
firstElementChild/lastElementChild/children 等標準屬性。childNodes 索引存取特定元素。