DOM中孩子的深度

时间:2009-10-20 18:08:39

标签: javascript jquery

我可以通过任何方式知道基于容器的孩子的深度。 示例:

<div id="dontainer">
   <ul>
      <li>1</li>
      <li>2</li>
      <li id="xelement">3</li>
      <li>4</li>
      <li>5</li>
   </ul>
</div>

“xelement”应该得到2(从0开始)。知道“li”处于同一水平。

由于

3 个答案:

答案 0 :(得分:8)

$.fn.depth = function() {
  return $(this).parents().length;
};

或类似的东西。

答案 1 :(得分:6)

假设您想要参考某个任意祖先来查找孩子的深度。

function depth(parent, descendant) {
  var depth = 0;
  var el = $(descendant);
  var p = $(parent)[0];
  while (el[0] != p) {
    depth++;
    el = el.parent();
  }
  return depth;
}

// Example call:
depth(".mainContent", "li")

完整的解决方案需要处理指定父级不是后代祖先的情况。

或者,仅当您支持ES5及更高版本时,直接使用DOM节点可以消除对jQuery的依赖:

function depth(parent, descendant) {
    var depth = 0;
    while (!descendant.isEqualNode(parent)) {
      depth++;
      descendant = descendant.parentElement;
    }
    return depth;
}

// Example call:
depth(document.querySelector('.mainContent'), document.querySelector('li'))

答案 2 :(得分:0)

一个简单的递归函数,类似于: (虽然我建议使用工具包,这是一个很好的小学习游戏,错误修复左边作为读者的练习。)

function countDepth(node, stopPredicate, count) {
  count = count || 0
  stopPredicate = stopPredicate || function () {}
  if (stopPredicate(node) || !node.parentNode) {
    return count
  }
  return countDepth(node.parentNode, stopPredicate, count + 1)
}

var depth = countDepth(document.getElementById("xelement"), function (node) {
  return "dontainer" == node.id
})

// or, with no predicate -- will count *full* depth
// depth = countDepth(document.getElementById("xelement"))

alert(depth)

编辑:如果您使用的是jQuery,请参阅nearest()函数。