JQuery ИЛИ Селектор? - PullRequest
       9

JQuery ИЛИ Селектор?

309 голосов
/ 15 февраля 2010

Мне интересно, есть ли способ иметь логику "ИЛИ" в селекторах jQuery. Например, я знаю, что элемент является потомком элемента с классом classA или classB, и я хочу сделать что-то вроде elem.parents('.classA or .classB'). Предоставляет ли jQuery такую ​​функциональность?

Ответы [ 5 ]

475 голосов
/ 15 февраля 2010

Используйте запятую.

'.classA, .classB'

Вы можете опустить пробел.

68 голосов
/ 04 апреля 2012

Использование запятой может быть недостаточным, если у вас есть несколько объектов jQuery, которые необходимо объединить.

Метод .add () добавляет выбранные элементы в набор результатов:

// classA OR classB
jQuery('.classA').add('.classB');

Это более многословно, чем '.classA, .classB', но позволяет создавать более сложные селекторы, такие как:

// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));
21 голосов
/ 07 ноября 2012

Я написал невероятно простой (5 строк кода) плагин именно для этой функции:

http://byrichardpowell.github.com/jquery-or/

Это позволяет вам эффективно сказать: «получить этот элемент или, если этот элемент не существует, использовать этот элемент». Например:

$( '#doesntExist' ).or( '#exists' );

Хотя принятый ответ обеспечивает аналогичную функциональность, если оба селектора (до и после запятой) существуют, оба селектора будут возвращены.

Надеюсь, это окажется полезным для всех, кто может попасть на эту страницу через Google.

14 голосов
/ 12 декабря 2013

Если вы хотите использовать стандартную конструкцию element = element1 || element2, где JavaScript вернет первое правдивое, вы можете сделать именно это:

element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');

, который возвращает первый найденный элемент. Но, возможно, лучшим способом было бы использовать запятую конструкцию селектора jQuery (которая возвращает массив найденных элементов) следующим образом:

element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];

, который вернет первый найденный элемент.

Я использую это время от времени, чтобы найти активный элемент в списке или какой-либо элемент по умолчанию, если активного элемента нет. Например:

element = $('ul#someList').find('li.active, li:first')[0] 

, который вернет любой li с классом active или, если его нет, просто вернет последний li.

Либо будет работать. Тем не менее, есть потенциальные потери производительности, поскольку || остановит обработку, как только найдет что-то правдивое, тогда как подход с использованием массива попытается найти все элементы, даже если он уже нашел один. Опять же, используя || У конструкции потенциально могут быть проблемы с производительностью, если она должна пройти через несколько селекторов перед тем, как найти тот, который будет возвращать, потому что она должна вызывать основной объект jQuery для каждого (я действительно не знаю, является ли это падением производительности или нет, это просто кажется логичным, что это может быть). В целом, тем не менее, я использую подход массива, когда селектор является довольно длинной строкой.

0 голосов
/ 23 октября 2015

Даниэль А. Уайт Солюшн отлично подходит для занятий.

У меня возникла ситуация, когда мне нужно было найти поля ввода, такие как donee_1_card , где 1 - индекс.

Мое решение было

$("input[name^='donee']" && "input[name*='card']")

Хотя я не уверен, насколько это оптимально.

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