jquery .off似乎不起作用

Mir*_*ror 5 javascript jquery

所以我会很简短:jquery .off()不会禁用我设置的监听.on.

HTML:

<span id="myspan">lol</span>
<button id="b1">jquery On</button>
<button id="b2">jquery Off</button>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

所以首先我们添加到myspantestfunc()点击jQuery的关于按钮.在我们这样做之后,如果我们点击跨度,我们会收到警报.接下来,我们单击jquery off按钮.这应该是删除监听器,但它没有.即使在那之后,当我们点击myspan testfunc仍然附加.

为什么?我该如何删除它?

Rob*_*nik 20

您的参数不匹配

它不是因为你绑定了一个不同的功能(匿名的).然后,你想从解除绑定testfunc......为了让您的活动(UN)结合工作之间的两个参数on,并off必须匹配.

可能的解决方法

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

$("#myspan").off("click");
Run Code Online (Sandbox Code Playgroud)

如果您将多个事件处理程序绑定到同一元素上的click事件,那么您还可以通过提供命名空间来区分它们,然后在off调用中使用正确的命名空间.

$("#myspan").on("click.test", function(e) { ... });
...
$("#myspan").off("click.test");
Run Code Online (Sandbox Code Playgroud)

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

$("#myspan").off(".test");
Run Code Online (Sandbox Code Playgroud)


ade*_*neo 7

你没有绑定事件处理程序testfunc,你将它绑定到一个匿名函数,并将你正在调用的函数挂在白色testfunc,所以你不能自动解除绑定.

它也是

$("#myspan").on("click", testfunc); // bind function
Run Code Online (Sandbox Code Playgroud)

然后

$("#myspan").off("click", testfunc); // unbind function
Run Code Online (Sandbox Code Playgroud)

或者解除匿名函数的绑定

$("#myspan").off("click"); // remove all handlers
Run Code Online (Sandbox Code Playgroud)

或者您也可以命名处理程序

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

并只删除该处理程序

$("#myspan").off("click.test");
Run Code Online (Sandbox Code Playgroud)