Ограничить селектор набором элементов (объект jquery)

0

Я ищу такую функциональность: $(restrictTo).findAlsoSelf('.box').doSomethingWithTheMatches()

где restrictTo - объект jquery (объект jQuery представляет собой набор элементов DOM). Поэтому я хочу, чтобы мои селекторы применялись к набору элементов, определяемых аргументом restrictTo.

.find() работает только для детей каждого элемента. Мне также нужен элемент, чтобы попытаться получить соответствие.

Демо: jsFiddle

Демо использует метод .on() который вы могли бы сказать, что я могу просто написать

$(document).on('click', '.box', function() {...

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

Хорошим примером этого является .color-box. Мне нужен только тот, который я только что добавил, чтобы пожелтеть. Тот, который уже находится в нижней части страницы и наверху .content должен оставаться зеленым.


Самое близкое, что я могу придумать, это:

$(restrictTo).find('.color-box').add($(restrictTo).siblings('.color-box')).doSomethingWithTheMatches()

Но это также соответствует любым братьям и сестрам уже на этом уровне dom (см. .color-box в области .content демонстрации.

Может быть, я слишком много думал об этом. Я думал, что я действительно знаком с jQuery, но я просто не могу придумать чистое решение.

Фактический проект использует requireJS с плагинами requireJS для шаблонов ручек и css. Весь код становится модульным. Поэтому, как только шаблон получает визуализацию, мне нужно связать и добавить javascript, чтобы идти вместе с этим фрагментом. У меня есть метод attach, в котором я вызвал require(['modules/tiny-module/tiny.bits']); но проблема в том, что если мне нужно загружать в tiny-module более одного раза, скрипт tiny.bits.js выполняется один раз, когда он загружается на страницу, когда tiny-module загружается в первый раз и никогда не присоединяется к вновь загруженный дом.

Как только я выясню это restrictTo, я в основном вызову метод bind() методе attach каждого модуля, который будет выполняться при каждой последовательной загрузке модуля.


Изменение: Мой ответ не разрешил, но я просто хочу документировать его. Он не работает с этим корпусом.

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

@phenomnomnominal ответ велик и работает с обоими демонстрациями.

Теги:
binding
jquery-selectors

1 ответ

1
Лучший ответ

Я думаю, что вы хотите:

jQuery.fn.filterFind = function(selector) { 
    return this.find('*')         // Take the current selection and find all descendants,
               .addBack()         // add the original selection back to the set 
               .filter(selector); // and filter by the selector.
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню