jQuery OR Selector?

Sua*_*uan 316 jquery jquery-selectors

我想知道是否有一种方法可以在jQuery选择器中使用"OR"逻辑.例如,我知道元素是具有类classA或classB的元素的后代,我想做类似的事情elem.parents('.classA or .classB').jQuery是否提供此类功能?

Dan*_*ite 483

使用逗号.

'.classA, .classB'
Run Code Online (Sandbox Code Playgroud)

您可以选择省略空格.

  • @alex:但它不会选择相同的元素两次(连接运算符会).它确实是一个OR选择器,因为它创建了两个或更多集合的UNION(而AND是一个交集). (48认同)
  • 应该注意的是,这不是一个'或'选择器,更像是一个中的多个选择器. (42认同)
  • `AND`将是`.classA.classB`. (38认同)
  • 它实际上取决于原始问题所暗示的内容......即:经典的"或"运算符会短路.因此,jquery用语中的'或'运算符也可能短路. (2认同)

Alp*_*Alp 69

如果您有多个需要连接的jQuery对象,则使用逗号可能还不够.

.新增()方法将所选择的元素到结果集:

// classA OR classB
jQuery('.classA').add('.classB');
Run Code Online (Sandbox Code Playgroud)

它比它更冗长'.classA, .classB',但是让你构建更复杂的选择器,如下所示:

// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));
Run Code Online (Sandbox Code Playgroud)


By *_*ell 22

我已经为这个功能编写了一个非常简单的(5行代码)插件:

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

它允许您有效地说"获取此元素,或者如果该元素不存在,则使用此元素".例如:

$( '#doesntExist' ).or( '#exists' );
Run Code Online (Sandbox Code Playgroud)

虽然接受的答案提供了与此类似的功能,但如果两个选择器(逗号之前和之后)都存在,则将返回两个选择器.

我希望它对任何可能通过谷歌登陆此页面的人都有帮助.

  • @Alp:考虑"a"||的行为 "b"`与`null || 香草JS中的"b"` 如果我们在这里应用相同的行为,`$(a).or(b)`应该返回`$(a)`如果它存在,否则它应该返回`$(b)`.我认为这个命名法没有任何问题,因为"或"符合JS"||"的行为.(或)运营商. (13认同)
  • 这不是布尔OR运算符的工作原理.如果两个选择器都返回元素,则OR运算符应返回所有这些元素,而不仅仅是第一个选择器的元素.你的插件应该命名为"ifEmpty"或"else"或类似的东西. (4认同)
  • 我也把它看成是`或`.其他人在谈论的更像是一个"concat"或"merge"动作. (4认同)

Ken*_*son 16

如果你想使用element = element1 ||的标准结构 element2,其中JavaScript将返回第一个真正的,你可以做到这一点:

element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');
Run Code Online (Sandbox Code Playgroud)

这将返回实际找到的第一个元素.但更好的方法可能是以这种方式使用jQuery选择器逗号构造(它返回找到的元素的数组):

element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];
Run Code Online (Sandbox Code Playgroud)

这将返回第一个找到的元素.

我不时地使用它来查找列表中的活动元素或者如果没有活动元素则查找默认元素.例如:

element = $('ul#someList').find('li.active, li:first')[0] 
Run Code Online (Sandbox Code Playgroud)

将返回任何具有活动类别的li,或者如果没有,将返回最后一个li.

要么工作.但是,作为||,可能存在性能损失 一旦发现一些真实的东西就会停止处理,而阵列方法将尝试找到所有元素,即使它已经找到了.然后再使用|| 如果在找到它将返回的那个之前必须通过几个选择器,那么构造可能会出现性能问题,因为它必须为每个选择器调用主jQuery对象(我真的不知道这是否是性能命中,这似乎是合乎逻辑的,它可能是).但是,一般情况下,当选择器是一个相当长的字符串时,我使用数组方法.