35

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

matchedset.find(selector).add(matchedset.filter(selector))

和相应的 parents() ?

4

5 回答 5

45

你可以这样做:

matchedset.find('*').andSelf().filter(selector);

对于父母:

matchedset.parents('*').andSelf().filter(selector);
于 2010-03-24T16:14:35.530 回答
17

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

  jQuery.fn.findAndSelf = function(selector) {
    return this.find(selector).add(this.filter(selector))
  }

然后像这样使用它:

$('.whatever').findAndSelf('.awesome')

如果你想变得花哨,你可以创建一个插件,它不仅适用于“查找”,还适用于“父母”和“孩子”以及其他基于选择器的插件:

  jQuery.fn.withSelf = function(plugin, selector) {
    return this[plugin](selector).add(this.filter(selector))
  }

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

$('.whatever').withSelf('find', '.awesome')
$('.whatever').withSelf('parents', '.awesome')

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

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

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

$('.whatever').traverse(['find','filter'], '.awesome')
$('.whatever').traverse(['parents','find'], '.awesome')
$('.whatever').traverse(['parents', 'filter'], '.awesome')
于 2010-09-18T14:19:57.083 回答
2

虽然 Jeoff 的解决方案很好,但有时能够迭代所有元素(包括没有选择器的自身)也很好。这个附加组件更灵活一点:

$.fn.all = function(selector) {
    if(selector===window.undefined) return this.find('*').andSelf();
    return this.filter(selector).add(this.find(selector));
};
于 2013-02-08T22:32:03.307 回答
0

查找“andSelf()”函数。

于 2010-03-24T14:39:03.523 回答
0

对于你有的父母closest(selector)

于 2013-03-17T13:47:50.167 回答