jQuery или селектор?

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

5 ответов


использовать запятую.

'.classA, .classB'

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


использование запятой может оказаться недостаточным, если у вас есть несколько объектов 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'));

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

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

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

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

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

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


Если вы хотите использовать стандартную конструкцию 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.

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


Daniel A. белое решение отлично подходит для классов.

У меня есть ситуация, когда мне пришлось найти поля ввода, такие как donee_1_card где 1-индекс.

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

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

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