【发布时间】:2011-01-16 20:44:40
【问题描述】:
我想知道是否有办法在 jQuery 选择器中使用“或”逻辑。例如,我知道一个元素要么是类 classA 或 classB 的元素的后代,我想做类似elem.parents('.classA or .classB') 的事情。 jQuery 有提供这样的功能吗?
【问题讨论】:
我想知道是否有办法在 jQuery 选择器中使用“或”逻辑。例如,我知道一个元素要么是类 classA 或 classB 的元素的后代,我想做类似elem.parents('.classA or .classB') 的事情。 jQuery 有提供这样的功能吗?
【问题讨论】:
使用逗号。
'.classA, .classB'
您可以选择省略空格。
【讨论】:
AND 将是 .classA.classB。
如果您有多个需要连接的 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'));
【讨论】:
我已经为这个功能编写了一个非常简单(5 行代码)的插件:
http://byrichardpowell.github.com/jquery-or/
它允许你有效地说“获取这个元素,或者如果那个元素不存在,使用这个元素”。例如:
$( '#doesntExist' ).or( '#exists' );
虽然接受的答案提供了与此类似的功能,但如果两个选择器(逗号之前和之后)都存在,则会返回两个选择器。
我希望它对任何可能通过 google 登陆此页面的人有所帮助。
【讨论】:
"a" || "b" 与 null || "b" 在 vanilla JS 中的行为。如果我们在这里应用相同的行为,$(a).or(b) 应该返回 $(a)(如果存在),否则应该返回 $(b)。我不认为这个命名法有什么问题,因为“或”与 JS“||”的行为相匹配(或)运算符。
or。其他人在谈论的更像是concat 或merge 动作。
如果您希望使用 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 对象(我真的不知道这是否会影响性能,这似乎是合乎逻辑的)。 In general, though, I use the array approach when the selector is a rather long string.
【讨论】:
我终于找到了破解方法:
div:not(:not(.classA,.classB)) > span
(选择类为classA 的div 或classB 直接子跨度)
【讨论】:
Daniel A. White 解决方案非常适合上课。
我遇到了一种情况,我必须找到像 donee_1_card 这样的输入字段,其中 1 是索引。
我的解决方案是
$("input[name^='donee']" && "input[name*='card']")
虽然我不确定它有多优化。
【讨论】: