【问题标题】:how to enable a disabled event handler with jquery如何使用 jquery 启用禁用的事件处理程序
【发布时间】:2015-08-15 11:34:24
【问题描述】:
$("#messageArea").keydown(function(e) {                             
    if((e.which != 13) && (e.keyCode != 27)) {
        var $this = $(this);
        $this.off();
        socket.emit("imTyping");
        setTimeout(function() {
            $this.on();
        }, 2000);
    } 
});

我正在尝试创建一个聊天应用程序,让一个人知道另一个人何时正在打字。此事件处理程序侦听任何按键(enter 和 esc 除外)并向服务器发出“imTyping”消息。调用此事件处理程序后,我想禁用(因此我不会向服务器发送一百万条消息),然后在 2 秒后再次启用它。这不会发生,一旦禁用它,它就会永久禁用它。

我还有其他 messageArea 元素的事件处理程序,所以我只想关闭 THIS 处理程序,而不是其他任何处理程序。

【问题讨论】:

  • 是的,.off() 删除事件处理程序,正如its documentation 中非常清楚地指出的那样。 (并且不带参数调用.off() 会从相关元素中删除所有 事件处理程序。)您是否尝试过设置标志enabled = true 然后测试if (enabled)?在您当前删除事件处理程序的位置将标志设置为 false,并在超时回调中返回 true。我发现这种方法比添加和删除相同的处理程序更干净。
  • 为什么不使用focus 而不是keydown
  • @Zakaria 这并不是真正准确地找出用户何时输入的方法

标签: javascript jquery event-handling settimeout eventhandler


【解决方案1】:

解压/重新绑定时解压成命名函数并传入正确的参数

$("#messageArea").keydown(typingKeydown);

function typingKeydown(e) {                             
    if((e.which != 13) && (e.keyCode != 27)) {
        var $this = $(this);
        $this.off('keydown', typingKeydown);
        socket.emit("imTyping");
        setTimeout(function() {
            $this.on('keydown', typingKeydown);
        }, 2000);
    } 
}

【讨论】:

  • 这将禁用其余的事件处理程序(我有多个用于 #messageArea 的 keydown 事件处理程序
  • @Rockstar5645,啊,在这种情况下,将处理程序传递给关闭。查看我的更新答案
  • @Rockstar5645,你应该在解除绑定事件时使用event.namespace。喜欢$("#messageArea").on('keydown.myNamespace', typingKeydown);
猜你喜欢
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多