【问题标题】:jQuery: Is it possible to select elements with only one class from among elements with, potentially, up to 3 classes?jQuery:是否可以从可能最多 3 个类的元素中选择只有一个类的元素?
【发布时间】:2012-01-20 16:16:14
【问题描述】:

例如,假设我有以下内容:

<span class="a b c">Has class a, b, and c</span>  
<span class="a">Has class a</span>  
<span class="b c">Has class b and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a c">Has class a and c</span> 
<span class="a">Has class a</span>

现在,假设我想选择所有 类 a 的元素。
这意味着只有第二个也是最后一个 spans 会被选中。
有没有简单的方法来做到这一点?

【问题讨论】:

    标签: javascript jquery jquery-selectors


    【解决方案1】:
    $('.a').not('.b, .c')
    

    这将选择所有具有a 类但没有bc 的元素。但是,它们仍然可以有 de 等类。如果您真的只想要除 a 之外没有其他类的元素,请使用 Phil 的答案。

    【讨论】:

    • 赞成,因为在很多情况下允许不相关的类可能更可取,并且生成的代码更清晰。虽然这不是“未来证明”,但您可能实际上并不想要我的答案给出的那种未来证明(与 OP 中的确切问题相匹配)。
    • 我收到Uncaught TypeError: $(...).not is not a function
    【解决方案2】:

    (请参阅下文,了解为什么您可能不想完全按照问题中的要求去做)

    你可以使用[class="a"]“属性等于选择器”,虽然它很脆弱:

    $('span[class="a"]').hide();
    

    问题是,如果您的类属性中有任何空格,那么它将中断。看到这个小提琴:http://jsfiddle.net/c7DP7/

    您可以通过使用普通类选择器对这些项目进行基本查询来解决此问题,然后在仅检查 a 设置的同时进一步过滤它们(并在第二个过滤器中修剪空白)。看到这个小提琴:http://jsfiddle.net/uD48E/1/

    $('.a')
        .filter(function(index){
            return $(this).attr("class").trim() == "a";
        })
        .hide();
    

    这个问题看起来像是在尝试制作更多“面向未来”的代码,但这种具体方法更脆弱。拒绝与您正在过滤的当前类无关的所有类可能会因为与类a 无关的原因而破坏事情(例如稍后添加的不相关类de)。如果您应用 jQuery 的 HTML 将来可能会更改,这一点很重要。

    更好的方法是只过滤掉影响a 类含义的类。允许这种灵活性实际上使您的代码更具前瞻性。请参阅 maxedison's answer 了解最佳方法。

    【讨论】:

      【解决方案3】:

      我想如果你想这样做,你可以简单地这样做:

      var spans = $("span[class='a']");
      

      【讨论】:

      • 对 OP 的简要说明:您不必像 Phil 在这里那样在选择器中包含单词 span。如果有可能具有所需类的 div 或 imgs 并且您想选择它们,$("[class='a']") 会这样做。
      • 这个问题是如果属性包含任何空格,它将中断。类选择器没有这个问题。
      【解决方案4】:

      另一种方法是删除这些类,然后检查是否还有任何类。如果没有,执行函数:

      JS Fiddle

      $('.a').each(function () {
          var $this = $(this);
          if (!$this.removeClass('a').attr('class').length) {
             //Execute function here
          }
      });
      

      【讨论】:

        【解决方案5】:

        使用这个:

        jQuery:

        $('[class="a"]');
        

        JavaScript:

        document.querySelectorAll("[class='a']");
        

        【讨论】:

        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
        猜你喜欢
        • 1970-01-01
        • 2011-09-30
        • 2018-09-16
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2021-04-04
        • 1970-01-01
        • 2013-05-01
        相关资源
        最近更新 更多