【发布时间】: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