jquery.off似乎不起作用

jmo0nnb3  于 2023-08-04  发布在  jQuery
关注(0)|答案(4)|浏览(179)

所以我长话短说jquery .off()不会禁用我用.on设置监听。
联系我们

<span id="myspan">lol</span>
<button id="b1">jquery On</button>
<button id="b2">jquery Off</button>

字符串
js:

$("#b1").on("click", add);
$("#b2").on("click", del);

function add() {
    $("#myspan").on("click", function(e) {
        var a = 1;
        testfunc(a, e);
    });
}

function del() {
    $("#myspan").off("click", testfunc);
}

function testfunc(num, event) {
   alert(num);
}


因此,首先我们通过单击 jquery On 按钮将testfunc()添加到myspan。在我们这样做之后,如果我们点击跨度,我们会得到一个警报。接下来,我们单击 jquery off 按钮。这应该删除侦听器,但它没有。即使在此之后,当我们单击myspan时,testfunc仍然连接。
为什么?我怎么才能去掉它?

2j4z5cfb

2j4z5cfb1#

参数不匹配

因为你绑定了一个不同的函数(匿名函数)。然后您尝试从testfunc解绑...为了让你的事件(取消)绑定工作**onoff之间的两个参数必须匹配**。

可能的解决方法

如果这是元素上唯一的click事件侦听器,那么通过调用以下函数来解除匿名函数的绑定是最简单的方法:

$("#myspan").off("click");

字符串
如果你绑定了多个事件处理程序来点击同一个元素上的事件,那么你也可以通过提供名称空间来区分它们,然后在off调用中使用正确的名称空间。

$("#myspan").on("click.test", function(e) { ... });
...
$("#myspan").off("click.test");


或者,如果您想取消绑定使用相同命名空间绑定的多个不同事件处理程序,请仅使用命名空间:

$("#myspan").off(".test");

sxpgvts3

sxpgvts32#

你并没有将事件处理程序绑定到testfunc,而是将它绑定到一个匿名函数,而在这个函数中,你只是调用testfunc,所以你不能自动取消绑定。
要么

$("#myspan").on("click", testfunc); // bind function

字符串
然后

$("#myspan").off("click", testfunc); // unbind function


或者取消绑定匿名函数

$("#myspan").off("click"); // remove all handlers


也可以命名处理程序

$("#myspan").on("click.test", function(e) {
    var a = 1;
    testfunc(a, e);
});


并且只移除该处理程序

$("#myspan").off("click.test");

5ssjco0h

5ssjco0h3#

在这个简单的例子中,将off调用替换为:

function del() {
    $("#myspan").off("click");
}

字符串
您不需要将处理程序函数传递给off调用,如果您这样做,它只会删除特定的处理程序。但是,您没有附加testfunc,而是附加了一个只调用testfunc()的匿名函数。因此,您的off调用什么也不做。
此外,您从未分配变量testfunc

vxf3dgd4

vxf3dgd44#

在我的例子中,上述解决方案都不起作用,因为事件侦听器是在具有onclick属性的元素上设置的。用于解除绑定我不能使用的事件off或unbind或类似的东西。我不得不使用removeAttr。对我很有效

相关问题