Jquery: получить предков (или потомков) и себя - PullRequest
34 голосов
/ 24 марта 2010

Можно использовать matchedset.find(selector) / matchedset.parents(selector), чтобы получить потомков / предков текущего сопоставленного набора, отфильтрованных селектором, но это не включает сам сопоставленный набор (если он также совпадает с селектором). Есть ли лучший (более краткий и / или более быстрый) способ получить его, чем

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

и соответствующие для родителей ()?

Ответы [ 5 ]

44 голосов
/ 24 марта 2010

Вы можете сделать это:

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

Для родителей:

matchedset.parents('*').andSelf().filter(selector);
17 голосов
/ 18 сентября 2010

Я думаю, что ваш метод эффективен с точки зрения времени выполнения, но вы, вероятно, просите синтаксический сахар. Для этого вы можете заключить его в плагин:

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

Тогда используйте это так:

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

Если вы хотите получить фантазию, вы можете создать плагин, который работает не только для 'find', но и для 'parent' и 'children' и других плагинов на основе селектора:

  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')
2 голосов
/ 09 февраля 2013

Несмотря на то, что решение Джеффа хорошо, иногда приятно иметь возможность перебирать все элементы, включая себя, без селектора. Это дополнение немного более гибкое:

$.fn.all = function(selector) {
    if(selector===window.undefined) return this.find('*').andSelf();
    return this.filter(selector).add(this.find(selector));
};
0 голосов
/ 17 марта 2013

Для родителей у вас есть closest(selector)

0 голосов
/ 24 марта 2010

Найдите функцию "andSelf ()".

...