我想知道是否有一种方法可以在jQuery选择器中使用“或”逻辑。例如,我知道一个元素可以是类classA或classB的元素的后代,并且我想做类似elem.parents('.classA or .classB')的操作。 jQuery是否提供这种功能?

#1 楼

使用逗号。

'.classA, .classB'


您可以选择省略空格。

评论


应该注意的是,这并不是一个“或”选择器,更像是一个中的多个选择器。

– alex
2010-2-15在3:57

@alex:但不会两次选择同一元素(串联运算符会选择两次)。它实际上是一个OR选择器,因为它创建了两个或更多集合的UNION(而AND是一个交集)。

–cletus
2010-2-15在3:59

谢谢,那行得通。由于调试方面的疏忽,我认为使用逗号表示“ AND”。

– Suan
2010-2-15在4:00

AND为.classA.classB。

–丹尼尔·怀特(Daniel A. White)
2010-2-15在4:28

实际上,这取决于原始问题所暗示的含义...即:经典而言,“或”运算符会短路。因此,用jquery来说,“或”运算符也可能会短路。

–马修
2012年4月22日在1:58



#2 楼

如果您有多个需要连接的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'));


#3 楼

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

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

它允许您可以有效地说“获取此元素,或者如果该元素不存在,请使用此元素”。例如:

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


虽然接受的答案提供了与此相似的功能,但是如果两个选择器(逗号前后)都存在,则两个选择器都将返回。 />
我希望它对可能通过google进入此页面的人有帮助。

评论


这不是布尔值OR运算符的工作方式。如果两个选择器都返回元素,则OR运算符应返回所有元素,而不仅是第一个选择器的元素。您的插件应命名为“ ifEmpty”或“ else”或类似名称。

–阿尔卑斯山
13年3月12日在16:16

@Alp:考虑“ a” ||的行为“ b”与null ||香草JS中的“ b”。如果在此处应用相同的行为,则$(a).or(b)如果存在则应返回$(a),否则应返回$(b)。我认为此命名法没有任何问题,因为“或”与JS“ ||”的行为相匹配(或)运算符。

– FtDRbwLXw6
13-10-18在14:35

我也将其视为或。其他人在谈论的更像是concat或merge动作。

–LéonPelletier
2015年11月9日在17:55



就我个人而言,我不会称其为“或”,因为它可能导致混乱(即使从技术上讲它可能是正确的,因为它是一种特殊的if / or)。这实际上是空合并,称为不同事物,并且使用不同的语言具有不同的运算符:en.wikipedia.org/wiki/Null_coalescing_operator

– JanErikGunnar
17年4月4日在10:15

术语“异或”(专有或)是准确的术语,但是人们经常在寻找异或时寻找异或,因为异或通常是特定的“异”类型。

– liljoshu
19年1月23日在17:20



#4 楼

如果您要使用element = element1 ||的标准构造element2,其中JavaScript将返回真实的第一个元素,您可以完全这样做:但是更好的方法可能是以这种方式使用jQuery选择器逗号构造(它返回找到的元素的数组):

我经常使用它来查找列表中的活动元素,或者在没有活动元素的情况下查找默认元素。例如:

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


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

都可以。但是,由于||可能会导致性能下降。一旦发现真相,它将立即停止处理,而数组方法将尝试找到所有元素,即使它已经找到了一个。然后再次使用||如果构造在找到要返回的选择器之前必须经过多个选择器,则可能会出现性能问题,因为它必须为每个选择器调用主jQuery对象(我真的不知道这是否会影响性能,似乎合乎逻辑)。总的来说,虽然,我使用数组方式时,选择是一个相当长的字符串。

评论


我认为find('。somethingToBeFound,.somethingElseToBeFound')与||不同构造。因为查找.somethingElseToBeFound是否在.somethingToBeFound之前位于DOM中,所以即使.somethingToBeFound存在,也会返回它。

–remo
20-04-29在11:57

#5 楼

最后,我发现了hack的操作方法:

#6 楼

Daniel A. White Solution非常适合于类。

我不得不找到诸如done_1_card之类的输入字段,其中1是索引。一直

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


尽管我不确定它的最优性。