遍历 N 级子级

Posted

技术标签:

【中文标题】遍历 N 级子级【英文标题】:Iterating Through N Level Children 【发布时间】:2011-06-10 18:04:19 【问题描述】:

这看起来很简洁,可以“内置”到 jQuery 中,但我认为它仍然值得一问。

我有一个问题,可以通过遍历元素的所有子元素轻松解决。我最近发现我需要考虑我需要比我目前正在做的“1 级”(只需调用 .children() 一次)更深一两个级别的情况。

jQuery.each(divToLookAt.children(), function(index, element)
    
        //do stuff
    
    );  

这就是我目前正在做的事情。为了深入第二层,我在为每个元素编写代码后运行另一个循环。

jQuery.each(divToLookAt.children(), function(index, element)

     //do stuff
    jQuery.each(jQuery(element).children(), function(indexLevelTwo, elementLevelTwo)
    
        //do stuff
    
    );  

);

如果我想更深一层,我必须从头再来。

这显然不好。我很想声明一个“级别”变量,然后把它全部处理好。有人对干净高效的 jQueryish 解决方案有任何想法吗?

谢谢!

【问题讨论】:

您在 elemtns 中寻找什么? +1 因为我很惊讶 jquery 没有为此提供本机选择器,并且因为我有点想念手动 dom 遍历哈哈。 【参考方案1】:

这是一个很棒的问题,因为关卡很深。 Check out the fiddle.

将其转换为插件。

激活

$('#div').goDeep(3, function(deep) // $.fn.goDeep(levels, callback)
    // do stuff on `this`
);

插件

$.fn.goDeep = function(levels, func)
    var iterateChildren = function(current, levelsDeep)
        func.call(current, levelsDeep);

        if(levelsDeep > 0)
            $.each(current.children(), function(index, element)
                iterateChildren($(element), levelsDeep-1);
            );
    ;

    return this.each(function()
        iterateChildren($(this), levels);
    );
;

【讨论】:

让它只是过滤掉东西,而不是成为一些能力有限的访问者。更多 jquery'ish/flexible imo。 @chris - 我看不出如何使用容器获取所有元素,然后基于动态选择器进行过滤可能更灵活/高效【参考方案2】:

这个问题太棒了:-)

如果你知道你的 DOM 不是太大,你可以找到所有的后代并过滤掉那些不符合条件的:

var $parent = $('#parent');
var $childrenWithinRange = $parent.find('*').filter(function() 
  return $(this).parents('#parent').length < yourMaxDepth;
);

之后,jQuery 实例 "$childrenWithinRange" 将是父 &lt;div&gt; 在某个最大深度内的所有子节点。如果你想要那个深度,你可以将“

【讨论】:

+1 我会这样做,除非我觉得我会过滤掉对非常深的后代所做的太多事情。【参考方案3】:

您应该可以像这样使用all-selector(docs)child-selector(docs)multiple-selector(docs) 来做到这一点:

示例: http://jsfiddle.net/mDu9q/1/

$('#start > *,#start > * > *,#start > * > * > *').doSomething();

...或者如果您想要将孩子定位到 3 层深度,您可以这样做:

示例: http://jsfiddle.net/mDu9q/2/

$('#start > * > * > *').doSomething();

这两个选择器都对querySelectorAll 有效,这意味着在支持的浏览器中性能大幅提升。

【讨论】:

【参考方案4】:

这个问题听起来可能是 XPATH。我不太了解浏览器支持,但在 XPATH 中你只需要创建一个类似

的路径
/*/*/*/*
https://developer.mozilla.org/en/introduction_to_using_xpath_in_javascript (适用于 FF、Chrome、Safari、Opera) http://msdn.microsoft.com/en-us/library/aa335968%28v=vs.71%29.aspx (还没试过)

【讨论】:

【参考方案5】:
var lvlFunc = function(elmt, depth) 
    if(depth > 0) 
        elmt.children().each(function(i, e)
            // do stuff on the way down
            lvlFunc($(this), --depth);
            // do stuff on the way out
        );
        // do stuff
    
;

lvlFunc(divToLookAt, 3);

如果执行“东西”的顺序很重要,请确保将“做东西”代码放在正确的位置。

【讨论】:

以上是关于遍历 N 级子级的主要内容,如果未能解决你的问题,请参考以下文章

记录--jquery 获取父级子级兄弟元素 + 实例

js或jquery如何获取父级子级兄弟元素(包括祖级孙级等)

js或jquery如何获取父级子级兄弟元素(包括祖级孙级等)

计算mysql中的第n级子元素

行列式04---k​ 级子式与余子式代数余子式与拉普拉斯定理

使用 ADF 将文件夹从具有 2 级子文件夹的 azure 容器移动到与子文件夹同名的容器级