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