从选择器中移除keydown事件不起作用

remove event of keydown from selector doesn't work?

本文关键字:keydown 事件 不起作用 选择器      更新时间:2023-09-26

我在其中一个元素上使用了keydown,但如果它不符合我的条件,我想取消它的绑定。但是我用了off()unbind,它似乎不起作用。的警报还是被触发了,我不知道为什么。

if (imgDOM.naturalWidth > imgDOM.naturalHeight) {
  $('#caption').attr('maxlength', 220);
  $("#caption").keydown(function(e) {
    if ((e.keyCode == 10 || e.keyCode == 13)) {
      e.preventDefault();
      alert('Landscape photo is allowed to have only single line of message.');
      return false;
    }
  });
} else {
  $('#caption').off('keydown', function() { //this won't work
    limit_lines_for_potrait();
  })
}

如果您删除off中的匿名函数,它将解决您的问题。

....
} else {
    $('#caption').off('keydown');
    limit_lines_for_potrait();
}

您正在使用.off(),就好像它正在监听一个新事件一样,在这种情况下,函数处理程序是对要解除绑定的函数的引用,而不是在解除绑定后运行的函数。limit_lines_for_potrait()应该是你想要删除的函数,但是你原来的绑定使用了一个你不能引用的匿名函数。

假设您在同一元素和事件上没有其他绑定,您可以将其简化为:$('#caption').off('keydown');,这将取消该元素和事件类型的所有侦听器的绑定。

之后运行函数,只需调用该函数:

} else {
  $('#caption').off('keydown');
  limit_lines_for_potrait();
}

由于unbind不是侦听器,因此不需要等待回调,它将始终在下一行运行之前执行。