我正在创建一个聊天脚本,我需要每三秒运行一次代码,而有人正在打字。我可以使用setInterval轻松地每三秒运行一次代码,但是将setInterval放入我的keypress事件会导致它从每个按键开始,所以它永远不会运行直到它们停止输入。另一个问题是当他们停止输入时停止它。有什么想法吗?
$("#message").keypress(function(event){
// Do stuff here every keypress
// Every three seconds, while someone is typing do this:
ws.send(JSON.stringify({"type": "typing", "from": {"id": client.self.id, "hash": client.self.hash}, "to": {"id": client.partner.id, "hash": client.partner.hash}}));
});
答案 0 :(得分:1)
好的,听起来很酷。
嗯,为此,
这是POC:
$(function(){
var request;
$("#message").keypress(function (event) {
// First clear the interval if exists
if(request){
clearInterval(request);
}
// the set the interval in the same variable
request = setInterval(function(){
ws.send(JSON.stringify({"type": "typing", "from": {"id": client.self.id, "hash": client.self.hash}, "to": {"id": client.partner.id, "hash": client.partner.hash}}));
}, 3000);
});
});
祝你好运!快乐jQuerying !!
答案 1 :(得分:1)
这段代码有点冗长,可能写得更好,但它可以解决问题。基本上,您希望在计时器运行时间隔执行代码,并且需要在每个按键上清除/设置该计时器。如果计时器熄灭,请停止一切:
var keypressTimer = null,
someInterval = null,
clearTimers,
doStuffWhileKeypress;
clearTimers = function() {
clearInterval(someInterval);
someInterval = null;
keypressTimer = null;
};
doStuffWhileKeypress = function() {
console.log('doStuffWhileKeypress executed');
};
$('#message').on('keypress', function(e) {
if(keypressTimer !== null) {
clearTimeout(keypressTimer);
}
keypressTimer = setTimeout(clearTimers, 1500);
if(someInterval === null) {
someInterval = setInterval(doStuffWhileKeypress, 3000);
}
});
答案 2 :(得分:1)
你知道当有两件事发生时,有人停止了打字:
blur
事件处理程序进行测试,或setTimeout()
和 clearTimeout()
对此进行测试。所以,也许这样的事情对你有用:
var timeoutId,
intervalId;
function stopMyInterval() {
clearInterval(intervalId);
intervalId = null;
}
$("#message").keypress(function(event){
clearTimeout(timeoutId); // user is still typing, so cancel previous timeout
if (!intervalId) {
intervalId= setInterval(function() {
ws.send(JSON.stringify({"type": "typing", "from": {"id": client.self.id, "hash": client.self.hash}, "to": {"id": client.partner.id, "hash": client.partner.hash}}));
}, 3000);
}
timeoutId= setTimeout(stopMyInterval, 500);
// try some different values here -----^^^ until it feels natural.
}).blur(stopMyInterval);
请注意,在调用clearInterval()
/ clearTimeout()
之前,您确实不需要测试是否已设置间隔/超时(如果传递无效值,则不会检测函数对象)。