Javascript 事件响应中的问题

Javascript 事件响应中的问题,javascript,jquery,Javascript,Jquery,我不明白为什么Test即使类open被添加到它中,也会继续触发?有没有关于如何以正确的方式使其在添加开放类时停止启动的想法 <div class="changer">Test</div> $(".changer:not('open')").on("click",function(){ $(this).addClass("open"); alert("passed"); }) 测试 $(“.changer:not('open')”)

我不明白为什么
Test
即使类
open
被添加到它中,也会继续触发?有没有关于如何以正确的方式使其在添加开放类时停止启动的想法

<div class="changer">Test</div>
$(".changer:not('open')").on("click",function(){
        $(this).addClass("open");
        alert("passed");
    })
测试
$(“.changer:not('open')”)。在(“单击”,函数(){
$(此).addClass(“打开”);
警报(“通过”);
})

这是因为元素是在页面加载时获取的,并且事件处理程序是在此时附加的,因此以后更改类不会删除事件处理程序

解决方案是检查事件处理程序中的类

$(".changer").on("click", function(){
    if ( ! $(this).hasClass('open') ) {
        $(this).addClass("open");
        alert("passed");
    }
});

或者,要使事件处理程序只启动一次,如果它符合您的需要,您可以使用jQuery
one()

您应该使用
.off()
在您不需要它时关闭侦听器@user3135757-我的错,我读错了,您不应该因为不匹配类而使用委托处理程序,检查事件处理程序中的类谢谢现在它可以工作了!但何时使用委托处理程序,何时不使用?通常,在动态插入元素时使用委托处理程序,但它们对于动态添加的类(如本例中)也很有用,但在需要检查是否未添加类时则不可用。此外,按照Simon的建议,使用
off
,如果您不需要,删除事件处理程序是个好主意,那么您甚至不需要类->
$(this)。关闭('click')
,非常有用,谢谢