Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jquery启用禁用的事件处理程序_Javascript_Jquery_Event Handling_Settimeout_Eventhandler - Fatal编程技术网

Javascript 如何使用jquery启用禁用的事件处理程序

Javascript 如何使用jquery启用禁用的事件处理程序,javascript,jquery,event-handling,settimeout,eventhandler,Javascript,Jquery,Event Handling,Settimeout,Eventhandler,我正在尝试创建一个聊天应用程序,让一个人知道另一个人在打字。此事件处理程序侦听任何按键(enter和esc除外),并向服务器发送“imTyping”消息。调用此事件处理程序后,我想禁用(因此我不会向服务器发送一百万条消息),然后在2秒钟后再次启用它。这不会发生,一旦它禁用它,它就会永久禁用它 此外,我还有其他messageArea元素的事件处理程序,因此我只想打开此处理程序的一个,而不想打开任何其他处理程序。提取到命名函数中,并在解除绑定/重新绑定时传入正确的参数 $("#messageArea

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


此外,我还有其他messageArea元素的事件处理程序,因此我只想打开此处理程序的一个,而不想打开任何其他处理程序。

提取到命名函数中,并在解除绑定/重新绑定时传入正确的参数

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

是的,
.off()
删除事件处理程序,如中非常清楚地指出的。(并且在没有参数的情况下调用
.off()
会从相关元素中删除所有事件处理程序。)您是否尝试过设置标志
enabled=true
,然后测试
if(enabled)
?在当前删除事件处理程序的位置,将标志设置为
false
,并在超时回调中恢复为true。我发现这种方法比添加和删除相同的处理程序更干净。为什么不使用
focus
而不是
keydown
?@Zakaria这并不是一种准确的方法来确定用户何时键入,这会禁用其余的事件处理程序(我有多个用于#messageArea@Rockstar5645,啊,在这种情况下,将处理程序传递到off。请参阅我的更新answer@Rockstar5645,取消绑定事件时应使用
event.namespace
。例如
$(“#messageArea”)。在('keydown.myNamespace',键入keydown);
$("#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);
    } 
}