【问题标题】:jQuery OR Selector?jQuery OR 选择器?
【发布时间】:2011-01-16 20:44:40
【问题描述】:

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

【问题讨论】:

    标签: jquery jquery-selectors


    【解决方案1】:

    使用逗号。

    '.classA, .classB'
    

    您可以选择省略空格。

    【讨论】:

    • 应该注意这并不是真正的“或”选择器,更像是多个选择器合二为一。
    • @alex: 但它不会选择相同的元素两次(连接运算符会选择)。它实际上是一个 OR 选择器,因为它创建了两个或多个集合的 UNION(而 AND 是一个交集)。
    • 谢谢,这行得通。由于调试疏忽,我认为使用逗号表示“与”。
    • AND 将是 .classA.classB
    • 这实际上取决于原始问题所暗示的内容......即:经典的“或”运算符会短路。因此,jquery 用语中的“或”运算符也可能短路。
    【解决方案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”或类似名称。
      • @Alp:考虑 "a" || "b"null || "b" 在 vanilla JS 中的行为。如果我们在这里应用相同的行为,$(a).or(b) 应该返回 $(a)(如果存在),否则应该返回 $(b)。我不认为这个命名法有什么问题,因为“或”与 JS“||”的行为相匹配(或)运算符。
      • 我也将其视为or。其他人在谈论的更像是concatmerge 动作。
      • 我个人不会称之为“或”,因为它可能会导致混淆(即使它在技术上可能是正确的,因为它是一种特殊的 if/or)。这实际上是空合并,它被称为不同的东西,并且在不同的语言中有不同的运算符:en.wikipedia.org/wiki/Null_coalescing_operator
      • 术语“xor”(异或)将是准确的术语,但人们在寻找 xor 时通常会搜索 or,因为 xor 通常是一种特定类型的“或” .
      【解决方案4】:

      如果您希望使用 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.

      【讨论】:

      • 我认为 find('.somethingToBeFound, .somethingElseToBeFound') 与 || 不同构造。因为如果 .somethingElseToBeFound 在 .somethingToBeFound 之前在 DOM 中,即使 .somethingToBeFound 存在也会返回。
      【解决方案5】:

      我终于找到了破解方法:

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

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

      【讨论】:

        【解决方案6】:

        Daniel A. White 解决方案非常适合上课。

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

        我的解决方案是

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

        虽然我不确定它有多优化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-02
          • 2012-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多