原生JS如何获取当前元素属于父元素第几个子元素

原生JS如何获取当前元素属于父元素第几个子元素
最新回答
那一抹浅笑

2022-04-28 16:32:30

在原生JavaScript中,获取当前元素在父元素中的位置(即第几个子元素)可以通过以下两种方法实现,具体取决于是否需要包含文本节点和注释节点:

方法一:包含文本和注释节点

使用previousSibling属性遍历所有前驱节点(包括文本节点和注释节点),统计数量即可确定位置。

var child = document.getElementById("a");var i = 0;while ((child = child.previousSibling) != null) i++;console.log(i); // 输出位置索引(从0开始)

关键点

  • previousSibling会遍历所有类型的节点(包括文本、注释等)。
  • 初始索引为0,若需从1开始计数,可将结果加1(i + 1)。
方法二:仅包含元素节点(排除文本和注释)

通过将父元素的子节点列表转换为数组,再使用indexOf查找当前元素的索引。

var child = document.getElementById("a");var parent = child.parentNode;var index = Array.prototype.indexOf.call(parent.children, child);console.log(index); // 输出位置索引(从0开始)

关键点

  • parent.children仅返回元素节点(忽略文本、注释等)。
  • Array.prototype.indexOf.call将类数组对象转换为数组后查找索引。
  • 同样可通过index + 1调整为从1开始的计数。
注意事项
  1. 索引差异:两种方法的索引可能不同(如方法一包含文本节点时索引更大)。
  2. 性能:方法二更简洁,但方法一在需要兼容极旧浏览器时可能更可靠。
  3. 边界情况:若元素无父节点(如未插入DOM),需额外判断parentNode是否存在。
完整示例<ul id="ul"> <li>123</li> <li id="a">a</li> <li>b</li> <li>c</li></ul><script> // 方法一:包含所有节点 var child = document.getElementById("a"); var i = 0; while ((child = child.previousSibling) != null) i++; console.log("包含文本节点时的位置:", i); // 输出2(因换行符文本节点存在) // 方法二:仅元素节点 var index = Array.prototype.indexOf.call(child.parentNode.children, child); console.log("仅元素节点的位置:", index); // 输出1(正确结果)</script>总结
  • 需要精确元素位置 → 使用方法二(parent.children + indexOf)。
  • 需处理所有节点类型 → 使用方法一(previousSibling循环)。
  • 根据实际需求选择合适方法,并注意索引的起始值(0或1)。