微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jquery – not selector,on()单击事件

我在执行以下代码时遇到一些问题:
var i = 1;  
$('.hello:not(.selected)').on('click',function(){
    $(this).addClass('selected');       
    console.log(i++);   
});

问题是这个代码应该在选择的类添加一次之后触发,但是它正在执行很多次,我只是希望我的变量不增加.换句话说,我试图做以下(这是有效的,但我不想使用活动的功能,因为它已被弃用):

$('.hello:not(.selected)').live('click',function () { 
   $('.hello').removeClass('selected');
   $(this).addClass('selected');
... 
});

非常感谢您的回复,
ķ

解决方法

您的代码正在使用当前满足此条件的元素集:
$('.hello:not(.selected)')

并为所有永恒设置此事件处理程序:

.on('click',function(){
    $(this).addClass('selected');
    $(this).css({opacity : 0.5});       
    console.log(i++);   
});

特别重要的是,一旦处理程序设置在元素上,它将继续处于活动状态,即使稍后该元素不再满足条件(在这种情况下,通过获取所选类).

有几种方法来实现所需的行为.一个是动态地检查“过滤器”条件是否仍然保存在事件处理程序内:

$('.hello').on('click',function(){
    if($(this).hasClass('selected')) {
        return;
    }
    $(this).addClass('selected');
    $(this).css({opacity : 0.5});       
    console.log(i++);   
});

一个是委托事件 – 在这种情况下,父元素将在其后代的一个通知事件,并且将在决定触发事件处理程序(代码无耻粘贴)之前动态地检查所述后代是否满足过滤条件从本李的答案):

$('body').on('click','.hello:not(.selected)',function() {
    $(this).addClass('selected');
    $(this).css({opacity : 0.5});       
    console.log(i++);
});

原文地址:https://www.jb51.cc/jquery/176686.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐