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

时间:2016-09-25 09:49:34

标签: javascript jquery

我在我的一个元素上使用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();
  })
}

2 个答案:

答案 0 :(得分:1)

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

....

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

答案 1 :(得分:0)

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

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

要在之后运行该功能,只需调用该功能:

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

由于unbind不是一个监听器,你不需要等待回调,它总会在下一行运行之前执行。