jQuery还是选择器?

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

254908 次浏览

使用逗号。

'.classA, .classB'

你可以选择省略空格。

如果有多个jQuery对象需要连接,使用逗号可能是不够的。

阀门()方法将选定的元素添加到结果集中:

// 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/ < a href = " http://byrichardpowell.github.com/jquery-or/ " > < / >

它允许你有效地说“获取这个元素,或者如果那个元素不存在,使用这个元素”。例如:

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

虽然接受的答案提供了类似的功能,如果两个选择器(在&如果逗号后存在,则两个选择器都将返回。

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

如果你想使用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]

它将返回带有active类的任何li,如果没有,则只返回最后一个li。

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

Daniel A. White的解决方案适用于课堂。

我遇到了这样的情况,我必须找到像donee_1_card这样的输入字段,其中1是一个索引。

我的解决方案是

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

虽然我不确定这有多理想。

最后我找到了如何做到这一点:

div:not(:not(.classA,.classB)) > span

(选择带有类classA或带有直接子跨度的classB的div)