【问题标题】:Remove keydown event from jquery element not working从 jquery 元素中删除 keydown 事件不起作用
【发布时间】:2016-08-05 20:59:59
【问题描述】:

我在元素上有 keydown 事件。

$("#element").keydown(function() {
     // do stuff!
});

现在我想删除它。

我尝试了unbindoff,但都没有工作。

$("#element").unbind("click");
$("#element").off("click");

如果使用unbindoff,我是否需要使用.on("click", function...).bind("click", function...) 而不是.click。如果是这样,这不是我的代码,我不允许修改它,所以我需要一种替代方法。

除了“取消绑定”或“关闭”之外,还有其他方法可以真正起作用吗?

谢谢,非常感谢您的帮助!

【问题讨论】:

  • 我在回来的一个项目中遇到了和你类似的问题。我想我在函数中添加了点击处理程序作为回调。这样,除非我通过不同的函数调用它,否则点击功能不会再次起作用。
  • @DustinRW 我不明白你的意思?
  • 我的意思是将你的函数包装在另一个函数中。例如,您可以将函数 above 包装在另一个编写的函数中并创建一组条件。 var outerFunction = function() { if (condition met) { $("#element").keydown(function() { // do stuff! }); }; 我只是假设您希望您的函数只被调用一次然后停止或仅在满足某些条件时运行。希望我的想法更清晰。
  • 关键是keydown的代码不是我的,是外部js。我只是想删除已经绑定的 keydown 事件。不过没关系,谢谢帮助!我已经让它开始工作了。

标签: javascript jquery


【解决方案1】:

.off( events [, selector ] [, handler ] ):添加的版本:1.7

.unbind( eventType [, handler ] ):添加的版本:1.0

.on() 方法将事件处理程序附加到 jQuery 对象中当前选定的元素集。从 jQuery 1.7 开始,.on() 方法提供了附加事件处理程序所需的所有功能。有关从旧 jQuery 事件方法转换的帮助,请参阅 .bind()、.delegate() 和 .live()。要删除与 .on() 绑定的事件,请参阅 .off()。要附加只运行一次然后自行删除的事件,请参阅 .one()

所以,我建议注意jQuery版本,因为bind/unbind用的不多。

在下面的 sn-p 中,您可以看到 .off() 工作正常:

$( window ).load(function() {
  $("#element").keydown(function(e) {
    console.log('keydown event');
  });
  $("#elementOff").click(function() {
    // unbind keydown
    $("#element").off('keydown');
    
    // attach click
    $("#element").off('click').click(function(e) {
      console.log('click event');
    });
  });
});
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>

<form>
  <input id="element" type="text">
</form>
<button id="elementOff">Unbind Keydown and attach Click</button>

【讨论】:

  • 写错了,我确实有keydown事件,对不起。
  • @DavidCallanan 答案和 sn-p 已更新。我希望这可以解决您的问题
  • @DavidCallanan 你可以尝试将你的代码包装在 $( window ).load(function() { function 中吗?
  • 还是不行。我在画布上做。我也尝试使用选择器“*”,以防我得到错误的元素。我会在页面加载后 2 秒尝试设置超时功能,看看会发生什么。
  • 还是没有运气。你知道是否可以检查元素上的事件吗?也许他们没有使用 keydown (尽管我不确定它会如何工作)。还是您认为使用画布与问题有关?
【解决方案2】:

由于 .click() 方法只是 .on( "click", handler ) 的简写,因此可以使用分离.关闭(“点击”):

$("#element").off("click", function(){
    $("#element").hide(); //not working
});

$("#element2").on("click", function() {
    $("#element2").hide(); //working
});

所以如果你有一个 .keydown( handler ),它就是 .on( "keydown", handler ) 在第一个和第二个变体,以及第三个中的 .trigger( "keydown" )。

提供的参数必须与要删除的事件处理程序相匹配。

如果您不想修改现有脚本或者它可能会被更改,我建议您只需在 html 页面中包含一个外部 .js 脚本即可解除事件绑定:

<script src="your_external_script.js"></script>

内容相似:

$(document).ready(function(){
    $("#element2").unbind("click");
});

【讨论】:

  • 根据api.jquery.com/off,不需要传入回调来移除它。另外我不记得我在哪里读过它,但它说你不能将匿名函数作为回调参数传递。这也是我朋友的外部代码,将来可能会改变(并使用匿名函数),那么在这种情况下我该怎么做呢?
  • 是的,当然。我只是举例说明“开”和“关”在同一上下文中的行为。要禁用它,您可以简单地使用 '("#element").off("click");'。我刚刚尝试使用外部脚本,它成功解除绑定事件,所以让我更新我的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多