我想知道是否有办法在jQuery选择器中使用“OR”逻辑。例如,我知道元素是具有类classA或classB的元素的后代,我想做elem.parents('.classA or .classB')
之类的事情。 jQuery是否提供了这样的功能?
答案 0 :(得分:472)
使用逗号。
'.classA, .classB'
您可以选择省略空格。
答案 1 :(得分:68)
如果您有多个需要连接的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'));
答案 2 :(得分:21)
我已经为这个功能编写了一个非常简单的(5行代码)插件:
http://byrichardpowell.github.com/jquery-or/
它允许您有效地说“获取此元素,或者如果该元素不存在,则使用此元素”。例如:
$( '#doesntExist' ).or( '#exists' );
虽然接受的答案提供了与此类似的功能,但如果两个选择器(逗号之前和之后)都存在,则将返回两个选择器。
我希望它对任何可能通过谷歌登陆此页面的人都有帮助。
答案 3 :(得分:14)
如果您希望使用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,或者如果没有,则只返回最后一个li。
要么工作。但是,作为||,可能存在性能损失一旦发现一些真实的东西就会停止处理,而阵列方法将尝试找到所有元素,即使它已经找到了。然后再使用||如果在找到它将返回的那个之前必须通过几个选择器,那么构造可能会出现性能问题,因为它必须为每个选择器调用主jQuery对象(我真的不知道这是否是性能命中,这似乎是合乎逻辑的,它可能是)。但是,一般情况下,当选择器是一个相当长的字符串时,我会使用数组方法。
答案 4 :(得分:0)
最后,我找到了破解方法:
div:not(:not(.classA,.classB)) > span
(选择具有直接子跨度的classA
或classB
类的div)
答案 5 :(得分:-2)
Daniel A. White Solution非常适合课程。
我遇到的情况是我必须找到输入字段,例如 donee_1_card ,其中1是索引。
我的解决方案已经
$("input[name^='donee']" && "input[name*='card']")
虽然我不确定它是多么优化。