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