Javascript .off不使用回调
我编写了一个小测试代码,因为我不确定是否可以在调用侦听器的范围之外关闭侦听器,我想知道为什么在我的测试代码中,当我在.off方法中包含回调时,代码似乎不再工作Javascript .off不使用回调,javascript,jquery,Javascript,Jquery,我编写了一个小测试代码,因为我不确定是否可以在调用侦听器的范围之外关闭侦听器,我想知道为什么在我的测试代码中,当我在.off方法中包含回调时,代码似乎不再工作 var testobj = { init: function() { testobj.listener(); }, listener: function() { $(document).on('mousedown', function() { testob
var testobj = {
init: function() {
testobj.listener();
},
listener: function() {
$(document).on('mousedown', function() {
testobj.listener_off();
console.log("on");
});
},
listener_off: function() {
$(document).on('mouseup', function() {
$(document).off('mousedown', function() {
console.log("off");
});
});
}
}
$(function() {
testobj.init();
});
因此,问题再次是:
$(document).off('mousedown', function() {
console.log("off");
});
似乎在使用时破坏了代码:
$(document).off('mousedown');
看起来很好用
此外,在处理多个事件侦听器(特别是那些对同一事件做出反应的侦听器)时,调用它们的最佳实践是什么?我是否正确地将它们分离为单独的函数,以便稍后调用它们,或者这可能会导致问题 将函数传递到
.off()
时,表示要删除该特定处理程序。由于您正在传递一个新实例化的匿名函数,因此它不是任何事件的处理程序,因此没有净效果
.off()
的这种形式在有引用的处理程序函数(变量名或某个对象的属性名等)时是有意义的。这样,在设置事件处理程序时,您可以通过该引用使用该函数,然后在要取消设置时再次使用该函数:
function someHandler(ev) {
// handle handle handle ...
}
// ...
$('#foo').on('click', someHandler);
// ...
if (itsChristmasTime()) {
$('#foo').off('click', someHandler);
}
在您的情况下,您可能只需要一个参数版本,只传递事件名称。跟踪事件处理程序的另一种方法是在事件名称上使用限定符。JQuery在事件名称中查找“.”,并忽略“.”和任何后缀以进行事件处理,但它不会完全忘记。因此,您可以使用它来识别处理程序,而无需跟踪正在使用的特定函数:
$('#foo').on('click.remove-me', function(ev) { ... });
// ...
if (itsChristmasTime()) {
$('#foo').off('click.remove-me');
}
这样,您就可以为小部件行为的不同方面维护单独的“单击”处理程序,并且只选择性地删除其中的一个/部分。这是因为当将函数作为第二个参数传递给函数时,它应该是注册的同一个函数实例 基本上,以下情况将不起作用:
$(myDiv).on('click', function () {});
$(myDiv).off('click', function () {});
但这将:
function clickHandler() {}
$(myDiv).on('click', clickHandler);
$(myDiv).off('click', clickHandler);
当您在不使用第二个参数的情况下调用时,它会删除该特定事件的所有侦听器,这就是它在您的情况下工作的原因。要删除的处理程序是
.off()
的第二个参数。由于该匿名函数与现有处理程序不匹配,因此它不会删除任何内容。