Javascript jquery在特定父级中取消绑定或关闭单击事件处理程序

Javascript jquery在特定父级中取消绑定或关闭单击事件处理程序,javascript,jquery,Javascript,Jquery,我有3个按钮,它们都有点击事件处理程序 如果按钮位于特定的父级中,则该按钮上不应有单击事件。但是,单击事件应该存在于特定的父级本身 在下面的代码中,单击.case2中的按钮时,我希望警报显示“case2 parent clicked”,但它仍然显示警报“button clicked” 为什么会这样?我该如何纠正它 谢谢 $('.button')。在('click',函数(e)上{ 警报(“点击按钮”); e、 停止传播(); }); $(“.case2”) .off('点击','按钮',功能(

我有3个按钮,它们都有点击事件处理程序

如果按钮位于特定的父级中,则该按钮上不应有单击事件。但是,单击事件应该存在于特定的父级本身

在下面的代码中,单击
.case2
中的按钮时,我希望警报显示“case2 parent clicked”,但它仍然显示警报“button clicked”

为什么会这样?我该如何纠正它

谢谢

$('.button')。在('click',函数(e)上{
警报(“点击按钮”);
e、 停止传播();
});
$(“.case2”)
.off('点击','按钮',功能(e){
e、 停止传播();
})
.on('click',函数(e){
警报(“已单击案例2父级”);
e、 停止传播();
});
.case1、.case2、.case3{
边缘:1米;
填充:1em;
背景色:#0b97c4;
宽度:5em;
高度:2米;
}
.按钮{
填充:1em;
背景色:红色;
}

在选择器中使用
:not

$('.button:not(.case2.button))。在('click',函数(e){
警报(“点击按钮”);
e、 停止传播();
});
$('.case2')。在('click',函数(e){
警报(“已单击案例2父级”);
e、 停止传播();
});
.case1、.case2、.case3{
边缘:1米;
填充:1em;
背景色:#0b97c4;
宽度:5em;
高度:2米;
}
.按钮{
填充:1em;
背景色:红色;
}

在选择器中使用
:not

$('.button:not(.case2.button))。在('click',函数(e){
警报(“点击按钮”);
e、 停止传播();
});
$('.case2')。在('click',函数(e){
警报(“已单击案例2父级”);
e、 停止传播();
});
.case1、.case2、.case3{
边缘:1米;
填充:1em;
背景色:#0b97c4;
宽度:5em;
高度:2米;
}
.按钮{
填充:1em;
背景色:红色;
}

将“.button”类添加到选择器:

$(".class2 .button").on("click",function(e){
    alert('button')
    e.stopPropagation()
 })
它应该首先启动。

将“.button”类添加到选择器中:

$(".class2 .button").on("click",function(e){
    alert('button')
    e.stopPropagation()
 })

它应该首先启动。

作为一个替代示例,只需连接处理程序而不关闭它

var buttons = $('.button');
buttons.not('.case2 .button').on('click', function(e) {
    alert('case first');
    e.stopPropagation();
  });
buttons.parents('.case2').on('click', function(e) {
  alert('case2 parent clicked');
  e.stopPropagation();
});

仅举一个备用示例,只需附加处理程序,而不关闭它

var buttons = $('.button');
buttons.not('.case2 .button').on('click', function(e) {
    alert('case first');
    e.stopPropagation();
  });
buttons.parents('.case2').on('click', function(e) {
  alert('case2 parent clicked');
  e.stopPropagation();
});

.off()
中使用匿名函数作为处理程序是没有意义的。该参数的意思是“如果有运行此函数的处理程序,请将其删除”。但由于它是一个匿名函数,因此它不能与先前添加的处理程序相同。from:“附加事件处理程序时应匹配最初传递给.on()的选择器。”因此我不认为它实际上是在删除按钮上设置的eventhandler。尝试
$('.case2.button').off('click').parent().on('click','.button',函数(e){your function stuff})
@Barmar实际上将函数参数传递给
.off()
,如果您希望清除已绑定的特定处理程序,则此功能非常有用。但是,老实说,我不知道它是否可以是一个匿名函数。不管怎样,我认为这是因为他在父对象上调用
.off()
,而不是在按钮上,并且父对象没有与该条件匹配的eventhandler。@ShamSUP我知道yuo可以将函数作为参数传递。传递匿名函数是没有意义的,因为它不能与绑定的函数相同,因为每个匿名函数都不同。在
.off()
中使用匿名函数作为处理程序是没有意义的。该参数的意思是“如果有运行此函数的处理程序,请将其删除”。但由于它是一个匿名函数,因此它不能与先前添加的处理程序相同。from:“附加事件处理程序时应匹配最初传递给.on()的选择器。”因此我不认为它实际上是在删除按钮上设置的eventhandler。尝试
$('.case2.button').off('click').parent().on('click','.button',函数(e){your function stuff})
@Barmar实际上将函数参数传递给
.off()
,如果您希望清除已绑定的特定处理程序,则此功能非常有用。但是,老实说,我不知道它是否可以是一个匿名函数。不管怎样,我认为这是因为他在父对象上调用
.off()
,而不是在按钮上,并且父对象没有与该条件匹配的eventhandler。@ShamSUP我知道yuo可以将函数作为参数传递。传递匿名函数是没有意义的,因为它不能与绑定的函数相同,因为每个匿名函数都是不同的。