Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 遍历N级子级_Javascript_Jquery_Iteration - Fatal编程技术网

Javascript 遍历N级子级

Javascript 遍历N级子级,javascript,jquery,iteration,Javascript,Jquery,Iteration,这看起来像是jQuery中“内置”的一些简洁的东西,但我认为它仍然值得一问 我有一个问题,通过迭代一个元素的所有子元素,可以很容易地解决这个问题。我最近发现,我需要考虑一些情况,在这些情况下,我需要比我目前正在做的“1级”(仅调用.children()一次)更深一层或两层 jQuery.each(divToLookAt.children(), function(index, element) { //do stuff } ); 这就是我现在正在做的。

这看起来像是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
    }
    );  
}
);
如果我想再深入一层,我必须从头再来

这显然不好。我想声明一个“level”变量,然后将其全部处理好。有人对一个干净高效的jQueryish解决方案有什么想法吗

谢谢

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);

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

这个问题太棒了:-)

如果您知道您的DOM不是太大,您可以找到所有的子体并过滤掉不符合条件的子体:

var $parent = $('#parent');
var $childrenWithinRange = $parent.find('*').filter(function() {
  return $(this).parents('#parent').length < yourMaxDepth;
});
var$parent=$(“#parent”);
var$childrenWithinRange=$parent.find('*').filter(函数(){
返回$(this).parents('#parent').length

之后,jQuery实例“$childrenWithinRange”将是该父级
中位于某个最大深度内的所有子节点。如果你想要准确的深度,你可以切换“这是一个很棒的问题,因为深度捕获的级别

将其转换为插件

激活

$('#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);
    });
};

您应该能够使用,和这样做:

示例:

…或者,如果您只想针对3个级别的儿童,您可以这样做:

示例:


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

问题的答案可能是XPATH。我不太了解浏览器支持,但在XPATH中,您只需要创建一个类似

/*/*/*/*
  • (在FF、Chrome、Safari和Opera中工作)
  • (还没试过)

您在元素中寻找的是什么?+1因为我很惊讶jquery没有用于此的本机选择器,而且因为我有点怀念手动dom遍历lol。+1我会这样做,除非我觉得我会过滤掉太多东西,而不是一些有限的capabvisitor.More jquery'ish/flexible imo.@chris-我看不出如何使用容器获取所有元素,然后基于动态选择器进行过滤会更灵活/高效
$('#start > * > * > *').doSomething();
/*/*/*/*