2010-02-15 61 views
284

我想知道是否有一种方法在jQuery选择器中具有“或”逻辑。例如,我知道一个元素是类classA或classB的元素的后代,我想要做类似elem.parents('.classA or .classB')的事情。 jQuery是否提供这样的功能?jQuery OR Selector?

回答

432

使用逗号。

'.classA, .classB' 

您可以选择省略该空间。

+36

应该指出,这不是一个真正的'或'选择器,更像是一个多选择器。 – alex 2010-02-15 03:57:03

+42

@alex:但它不会选择相同的元素两次(这是一个串联运算符)。它确实是一个OR选择器,因为它创建了两个或更多集合的UNION(而AND是一个交集)。 – cletus 2010-02-15 03:59:36

+0

谢谢,这是有效的。由于调试疏忽,我认为使用逗号意味着'AND'。 – Suan 2010-02-15 04:00:18

61

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

我已经写一个令人难以置信的简单(5行代码)插件完全适用于此功能:

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

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

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

虽然接受的答案提供了类似的功能这一点,如果两个选择(&前的逗号后)存在,无论是选择将被退回。

我希望这对任何可能通过谷歌登录此页面的人都有帮助。

+4

这不是布尔OR运算符的工作方式。如果两个选择器都返回元素,则OR运算符应该返回所有这些元素,而不仅仅返回第一个选择器的元素。你的插件应该被命名为“ifEmpty”或“其他”或类似的东西。 – Alp 2013-03-12 16:16:39

+9

@Alp:考虑'“a”||的行为“b”与“null ||” “香草JS”中的“b”。如果我们在这里应用相同的行为,$(a)。或(b)'应该返回'$(a)',如果它存在,否则它应该返回'$(b)'。我不认为这个命名法有什么问题,因为“或”符合JS“||”的行为, (或)运营商。 – FtDRbwLXw6 2013-10-18 14:35:56

+3

我也把它看成是一个'或'。其他人谈论的更像是一个'concat'或'merge'动作。 – 2015-11-09 17:55:43

13

如果您要使用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与活动的类或应该没有,只会返回最后一个李。

两者都可以工作。尽管如此,有潜在的性能损失只要找到真正的东西就会停止处理,而数组方法将尝试找到所有元素,即使它已经找到了一个元素。然后再次使用||构造可能会遇到性能问题,如果它必须经过几个选择器才能找到它会返回的,因为它必须调用每个主jQuery对象(我真的不知道这是否是性能打击,它可能是合乎逻辑的)。但是,一般来说,当选择器是一个相当长的字符串时,我使用数组方法。

0

Daniel A. White Solution非常适合上课。

我有一种情况,我必须找到输入字段,如donee_1_card其中1是一个索引。

我的解决方案已经

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

虽然我不知道它是如何最佳。