【问题标题】:How to use a not selector with multiple span classes?如何使用具有多个跨度类的非选择器?
【发布时间】:2013-01-25 16:14:35
【问题描述】:

我上一个问题的扩展 How to select a span with multiple classes and placed inside an anchor?

**为此添加扩展,我想添加一个需要从点击事件中忽略的类。因此我使用了下面不起作用的代码。任何帮助将不胜感激!

$('span.c3, span.c4:not(.c5)').parents('a').click(function (e) {
            alert("clicked!");
   });

我也尝试在 not 选择器中使用 span.c5,但这也不起作用:(

请在下面找到 html 更改:

<div class="c0 c">
        <a class="c1 c2">
        <span class="c3 c4 c5"></span>Anchor_Text
        </a>
    </div>

【问题讨论】:

    标签: jquery jquery-selectors selector html


    【解决方案1】:

    您可以使用.not,它将过滤您选择的所有元素:

    $('span.c3, span.c4').not('.c5').parents('a').click(function (e) {
        alert("clicked!");
    });
    

    顺便说一句,你确定你想要的是parents吗?我想你真正想要的是closest


    这是小提琴:http://jsfiddle.net/GCNKg/


    更新:由于您在 cmets 中提到您必须使用 :not 选择器,因为您正在使用事件委托,因此您必须将 :not 添加到 每个 选择器,或者只是将以下过滤器添加到您的脚本中:

    $.expr[':'].any = $.expr.createPseudo(function( selector ) {
        return function (el) {
            return $.find.matches(selector, [el]).length > 0;
        }
    });
    

    这会将 :any 选择器添加到 jQuery/Sizzle(我基于 this jQuery feature request,但对其进行了更新,使其适用于 the new Sizzle selector engine used by jQuery since version 1.8)。

    一旦你包含了那个过滤器,你就可以在你的选择器中使用:any,它可以很好地与:not一起工作:

    $(document.body).on('click', 'span:any(.c3, .c4):not(.c5)', function (e) {
        alert("clicked!");
    });
    

    这是小提琴:http://jsfiddle.net/GCNKg/1/

    【讨论】:

    • 谢谢约瑟夫。使用 .not() 有效!我将尝试评估这两个属性并在不同的场景中对其进行测试,看看哪一个最适合。感谢您的回复!
    • 但是如何使用 .not() 和 $('body').on("click", ".c1, .c2", function () { alert("clicked!"); } })
    • @EvolvingTechie - 你不能。在这种情况下,您必须在每个选择器".c1:not(.c5), .c2:not(.c5)" 上显式取消:not 选择器。或者,只需在您的回调中检查hasClass('c5'),然后提前返回。
    • 太棒了,在现有的每个选择器上使用 :not 选择器都可以工作。我也会尝试使用 hasClass。非常感谢!
    • @EvolvingTechie - 我添加了一个更简单的解决方案来使用:not 选择器。查看我的更新。
    【解决方案2】:

    使用.not() 函数,而不是选择器。例如:

    $('span.c3, span.c4').not('.c5').parents('a').click(function (e) {
        alert("clicked!");
    });
    

    这是jsFiddle demo

    【讨论】:

    • +1 使用:any 会更容易所以。我希望 jQuery 支持这一点。查看我的答案的更新。你认为我们能以某种方式将它带入 Sizzle 核心。似乎没有人 on this thread 意识到这对事件委托有多么有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2019-01-13
    相关资源
    最近更新 更多