我有这个代码可以正常工作,但我想停止轮询和clearInterval如果用户在说5次迭代后没有处于非活动状态(没有鼠标移动)而不是连续循环。
var i, active = new Date, iter = 1;
$(window).on('mousemove', function(e){
active = new Date;
});
i = setInterval(function(){
if(new Date().getTime() - active.getTime() < 1000){
console.log("sending active event to server.....");
iter = 1;
else{
iter++;
if(iter >= 5){
clearInterval(i);
}
}
}, 2000);
现在它在这个例子中每两秒检查一次。我想检查活动日期说5次,如果它连续过期5次迭代,请调用clearInterval(i)...所以mousemove回调内部的东西应该只在它当前没有运行时才重新初始化setInterval。我怎么能做到这一点?感谢您提供的任何提示和样品。如果可能的话,我想继续使用匿名函数。
答案 0 :(得分:1)
分隔间隔功能
function intFunc(){
if(new Date().getTime() - active.getTime() < 1000){
console.log("sending active event to server.....");
iter = 1;
else{
iter++;
if(iter >= 5){
clearInterval(i);
}
}
};
现在,在你需要的两个地方打电话给他们
var i;
$(window).on('mousemove', function(e){
active = new Date;
i = setInterval(intFunc, 2000);
});
i = setInterval(intFunc, 2000);
答案 1 :(得分:0)
一种简单的方法就是删除clearInterval调用,而只是在iter < 5
时轮询服务器。
但是这仍然有点浪费,因为处理程序在无操作时仍然被调用,当你希望你的笔记本电脑/手机处于省电模式时这很糟糕。所以我所做的基本上就是你所拥有的,但是在调用clearInterval之后,设置一个一次性的mousemove处理程序来重启轮询。
如果没有命名函数我就没有办法做到这一点(我假设你不想进入Y-combinators之类的东西),但你可以隐藏它的名字 - 以及其他的 - 来自通过围绕整个事物使用匿名函数来外部世界:
(function () {
var i, active = new Date, iter = 1;
$(window).on('mousemove', function(e) {
active = new Date;
});
function startPolling() {
i = setInterval(function() {
if (new Date().getTime() - active.getTime() < 1000) {
console.log("sending active event to server.....");
iter = 1;
}
else{
iter++;
if (iter >= 5) {
clearInterval(i);
$(window).one('mousemove', function () {
startPolling();
});
}
}
}, 2000);
}
startPolling();
})();