Jquery:获得祖先(或后代)和自我

gsa*_*kis 34 jquery filter ancestor descendant

可以使用matchedset.find(selector)/ matchedset.parents(selector)来获取由选择器过滤的当前匹配集的后代/祖先,但是不包括匹配集本身(如果它恰好也匹配选择器).是否有更好的(更简洁和/或更快)的方式来获得它

matchedset.find(selector).add(matchedset.filter(selector))
Run Code Online (Sandbox Code Playgroud)

和父母的相应()?

Nic*_*ver 44

你可以这样做:

matchedset.find('*').andSelf().filter(selector);
Run Code Online (Sandbox Code Playgroud)

对于父母:

matchedset.parents('*').andSelf().filter(selector);
Run Code Online (Sandbox Code Playgroud)

  • 可能需要注意的是,andSelf现已弃用,并且已被addBack()替换,后者也接受选择器.http://api.jquery.com/addBack/ (10认同)

Jeo*_*lks 17

我认为你的方法在执行时间方面是有效的,但你可能要求的是语法糖.为此,您可以将其包装到插件中:

  jQuery.fn.findAndSelf = function(selector) {
    return this.find(selector).add(this.filter(selector))
  }
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

$('.whatever').findAndSelf('.awesome')
Run Code Online (Sandbox Code Playgroud)

如果你想得到想象,你可以创建一个插件,不仅适用于'find',而且适用于'parent'和'children'以及其他基于选择器的插件:

  jQuery.fn.withSelf = function(plugin, selector) {
    return this[plugin](selector).add(this.filter(selector))
  }
Run Code Online (Sandbox Code Playgroud)

然后,您将提供要调用的遍历插件的第一个参数:

$('.whatever').withSelf('find', '.awesome')
$('.whatever').withSelf('parents', '.awesome')
Run Code Online (Sandbox Code Playgroud)

只是为了踢,另一个有趣的插件,让你可以同时调用任意数量的遍历插件:

  jQuery.fn.traverse = function(plugins, selector) {
    var set = new jQuery();
    $.each(plugins, function(i, val) {
      set.add(this[val](selector));
    }
    return set
  }
Run Code Online (Sandbox Code Playgroud)

你可以使用基于选择器的插件的任意组合来调用这个插件,如下所示:

$('.whatever').traverse(['find','filter'], '.awesome')
$('.whatever').traverse(['parents','find'], '.awesome')
$('.whatever').traverse(['parents', 'filter'], '.awesome')
Run Code Online (Sandbox Code Playgroud)