我有2个setTimeout函数,该函数调用2个不同的函数,但是在某些情况下,从setTimeout调用函数会发生多次,因此不确定如何解决此问题将不胜感激。我使用此脚本在网页上查找用户的空闲时间,并将空闲时间更新到数据库。
window.onmousemove = resetTimer('y');
window.onload = resetTimer('y');
window.onmousemove = resetTimer('y');
window.onmousedown = resetTimer('y');
window.onmouseup = resetTimer('y');
window.ontouchstart = resetTimer('y');
window.onclick = resetTimer('y');
window.onkeypress = resetTimer('y');
window.onscroll = resetTimer('y');
var t;
function resetTimer(v) {
clearTimeout(t);
if (v == 'y') {
t = setTimeout(Ytimepop, 4000);
}
if (v == 'z') {
t = setTimeout(Ztimepop, 5000);
}
}
function Ytimepop() {
// ajax code
resetTimer('z');
}
function Ztimepop() {
// ajax code
}
在窗口鼠标悬停和其他事件上,我调用了一个函数,该函数将调用resetTimer('y')并开始计算Ytimepop计时器,并且该函数被多次调用,而Ztimepop计时器也是如此。
答案 0 :(得分:0)
您应该使用
var t;
window.onmouseover = function() {
resetTimer('y');
}
function resetTimer(v) {
clearTimeout(t);
// --- rest of your code
}
不清楚您要使用onmouseover
还是onmousemove
答案 1 :(得分:0)
此代码段出现问题:
window.onmousemove = resetTimer('y');
从本质上讲,您正在做的事情与此类似:
let returnValue = resetTimer('y'); // resetTimer executed, returns `undefined`
window.onmousemove = returnValue; // Also `undefined`
在此初始调用之后,您的resetTimer
再也不会执行,更不用说mousemove
了。因此,只需将其包装另一个函数即可以传统方式调用resetTimer
:
window.onmousemove = function(){ resetTimer('y'); };
或使用新的arrow function
:
window.onmousemove = () => resetTimer('y');