Фильтрация элементов в наборе jQuery на основе их родительского узла - PullRequest
2 голосов
/ 29 июля 2011

Предположим, у меня есть два контейнера с одинаковым CSS-кодом и их подэлементами.

<div class="wrapper">
    <div class="item">item</div>
    <div class="dummy">distrating item</div> <!-- dummy one -->
    <div class="item">item</div>
    <div class="item">item</div>
    ...
</div>
<div class="wrapper">
    <div class="item">item</div>
    <div class="dummy">distrating item</div> <!-- dummy one -->
    <div class="item">item</div>
    <div class="item">item</div>
    ...
</div>

Это, конечно, пример. но дело в том, что это. Если я определю селектор jQuery как:

$(".wrapper .item")

, а затем написать плагин jQuery, который должен что-то делать с этими элементами, но для каждого контейнера. Как мне предположить получить подмножество элементов из всего набора, принадлежащих каждому контейнеру?

$.fn.extend({
    randomize: function() {
        if (this.length > 1)
        {
            var set = this;
            var origSelect = set.selector;
            var containers = this.parent();
            $.each(containers, function() {
                var container = $(this);
                var items = set.filter(?????);
                ....
            });
        }
        return this;
    }
});

На основании данных, которые у меня есть во внутренней функции:

  • весь набор
  • Оригинальный селектор элементов
  • текущий контейнер

Есть ли селектор jQuery, который может помочь мне получить подмножество элементов из всего набора, принадлежащих определенному элементу.

Первая возможность

Это, конечно, не работает:

$(origSelect, container);

, что эквивалентно

$(".wrapper .item", ".wrapper");

потому что контейнерный класс CSS является частью оригинального селектора. Если бы не было, это бы сработало. но я не могу это контролировать.

Вторая возможность

Фильтрация по

container.children();

также потерпит неудачу, поскольку он также выберет пустышку предметов.

Но идея состоит в том, чтобы повторно использовать существующий набор jQuery, который, конечно, быстрее, чем снова выбирать узлы DOM, что делается в обоих случаях.

Так что в основном я хочу что-то вроде:

set.filter(something);

Но я не знаю, есть ли фильтр для того, что я хочу.

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Вы можете сравнить родительские элементы каждого элемента с вашим текущим элементом контейнера:

$.each(containers, function() {
    var container = $(this);
    var items = set.filter(function() {
        return this.parentNode == container[0];
    });
    // ...
});
0 голосов
/ 29 июля 2011

Вы можете попробовать это

$.fn.extend({
    randomize: function() {
        if (this.length > 1)
        {
            var set = this;
            var origSelect = set.selector;
            var selectorArr = origSelect.split(" ");
            var itemSelector = selectorArr[selectorArr.length - 1];
            var containers = this.parent();
            $.each(containers, function() {
                var container = $(this);
                var items = container.filter(itemSelector);
                ....
            });
        }
        return this;
    }
});
...