获取特定元素后的所有相似元素,即使深度嵌套也是如此

时间:2011-12-14 12:03:53

标签: jquery traversal

我希望在特定元素之后获取所有复选框。 此复选框位于不同的div和表中。 我试过了:

$('.available').click(function() {
 $(this).nextAll("input:checkbox").each(function()
 {
   //code
 });
});

由于

3 个答案:

答案 0 :(得分:6)

你必须爬上DOM(test case):

$(this)                                         
    .parents().andSelf()                         // get all parents of this as well
    .nextAll().find('input:checkbox').andSelf()  // get all siblings after and find any
    .filter('input:checkbox');                   // if real next sibling wasn't, kill it

请记住这是非常重要的。你是:

  1. 爬上DOM(非常快)
  2. 对于每个父母,获得所有下一个兄弟姐妹(半沉重的)
  3. 然后,向下搜索每个复选框,在子节点上多次重复相同的搜索
  4. 最后,过滤掉任何非复选框(必须再次通过找到的设置)
  5. 这是 jQuery 魔术,但除了jQuery之外,肯定有更好的方法。这可能是O(n ^ n)复杂性 - 最糟糕的一种。

答案 1 :(得分:0)

我不知道你的特定元素是否是一个复选框,否则你必须从一个包含所有复选框和元素的集合开始:

var selector = ':checkbox, #target';

然后,您可以使用index()

找出该集合中元素的索引
var targetIx = $('#target').index(selector);

您还可以使用该索引将您的设置减少到所有内容:

var elementsAfter = $(selector).slice(targetIx+1);

答案 2 :(得分:0)

nextAll只会得到兄弟姐妹,所以......

首先让我们获取所有复选框:

var checkboxes = $("input:checkbox");

接下来,准备一个数组来保存我们想要的数组:

var checkboxesslice = [];    

现在让我们循环来寻找我们的起点:

var startedyet = false;
for( var i=0; i<checkboxes.length; i+=1){
    if(startedyet){
        checkboxesslice.push(checkboxes[i]);
    }
    if(checkboxes[i] === $(this) ){
         startedyet = true;
    }     
}

这是完全未经测试的,但你会明白这一点。