【问题标题】:setTimeout with condition inside before running againsetTimeout 在再次运行之前带有条件
【发布时间】:2015-06-12 16:40:02
【问题描述】:

我需要使用 setTimeout 或 setInterval 做某事,但无法使其工作。

假设我有一个图像在窗口完成渲染时加载,用户在 20 秒内保持空闲和/或做事,当这 20 秒过去后用户做了一些事情(点击、移动或滚动)我想刷新图像,但如果时间是 20 秒并且用户处于空闲状态,我想继续计算时间,直到用户进行交互,然后再清除值并重新开始观看。

案例:

  • 图像加载、用户移动、保持空闲、点击(所有这些都在 20 秒内),然后用户在 20 秒后进行交互,因此图像刷新、setTimeout 或 setInterval 清除并重新开始

  • 图像加载、用户移动、保持空闲(所有这一切都在 20 秒内),然后用户在 20 秒后保持空闲,因此图像不会刷新并且 setTimeout 或 setInterval 继续计数而不是清除等待用户进行交互以重新开始

无论如何我都无法采用这种方法。

我有这样的东西不起作用:

var refresh = setTimeout(function(){
    console.log('Inside waiting for user interaction');
    //If user is idle while inside here keep waiting and counting

    $(document).on('mousemove click', function(){
        console.log('Inside because of user interaction');
        //Refresh image and then clearTimeOut
        clearTimeout(refresh);
        //Start again waiting for 20 seconds to get inside
        setTimeout(refresh);
    });
}, 20000); //20 seconds before waiting for user interaction

非常感谢!

【问题讨论】:

  • 换一种说法,你只想考虑20秒后的活动?
  • 您要多次添加事件监听器
  • @RoyJ 完全正确,我把描述复杂化了抱歉哈哈。我正是想要那个!

标签: javascript jquery settimeout setinterval


【解决方案1】:

有一个标志来指示计时器是否已过,并在处理鼠标活动时检查该标志。

var elapsed, timer;

function refresh() {
    //... stuff you want to do ...
    resetTimer();
}

function resetTimer() {
    if (!elapsed) {
        clearTimeout(timer);
    }
    elapsed = false;
    timer = setTimeout(function () {
        elapsed = true;
    }, 10000);
}

function mouseActivity() {
    if (elapsed) refresh();
}

演示小提琴:http://jsfiddle.net/7768nbze/

【讨论】:

  • 确实有些人急于在不发表评论的情况下对有效的答案投反对票。
  • @arbustobce 这是你想要的吗?
  • 抱歉之前无法回复,我刚刚尝试了您的代码,添加了我需要的额外部分,并且运行完美流畅,非常感谢!也感谢谦虚的隆隆声对我的帮助,你们两个都很棒,继续努力! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2011-12-13
  • 2017-01-24
相关资源
最近更新 更多