判断当前节点是其父元素的第几个节点
tip
考察DOM API
的熟悉程度,以及解决业务场景的思路
一、题意
写一个函数返回当前节点是其父元素的第几个节点
function getNodeIndex(node){
let index = 0;
return index;
}
二、解法
Element API
高效获取,性能最优
利用Element的API - previousElementSibling
,可以获取到当前元素在其父元素的子元素节点中的前一个元素节点。如果该元素已经是第一个元素节点,则返回null
。
function getNodeIndex(node){
let index = 0;
while((node = node.previousElementSibling) !== null){
index++;
}
return index;
}
为什么不用`previousSibling`?
Node.firstChild 和 Node.previousSibling之类的方法获取到的节点,有可能是文本节点(text),不一定都是元素节点。
for循环遍历
因为每次都是从第一子节点开始遍历,性能并非最优
function getNodeIndex(node){
let index = 0;
const parentNode = node.parentNode;
for(let i = 0; i < parentNode.children.length; i++){
if(node == parentNode.children[i]){
break;
}
index++;
}
return index;
}
泛型方法
for循环的变通实现,实际应用泛型方法,是加分点
function getNodeIndex(node){
let index = 0;
index = Array.prototype.indexOf.call(node.parentNode.children, node);
return index;
}