问题解答:如何每隔2分钟弹出一次弹出框

事情是这样的,昨天有个粉丝问我:如何每隔2分钟弹出一次弹出框

我说 那不就是setInterval嘛,然后设定2分钟执行一次。

他说 不是的,这个2分钟只是我说的一个时间,不是常量,是服务端下发的。

我说 那就获取了这个时间值再定时。

他说 但是如果用户把浏览器关了,如果2分钟内又打开了,得记住时间,然后距离上次如果到2分钟了,就弹出,如果超过了就直接弹,不用等了。

我说 看来还得记录一下每次的时间啊。但如果每次记住了,存到localStorage里,用户如果不刷新,还拿不到最新值。

他说 是啊,很费劲。

1 需求分析 

  1. 首次来到页面,直接弹出;
  2. 首次弹出后,记录时间点,记录距离下次的时间点;
  3. 这个时间点得存到localStorage里;
  4. 但是存到localStorage里呢,用户如果不刷新页面,下次的时间点就拿不到;
  5. 所以需要本地再存一份,可以存到一个变量里;
  6. 首次弹出后,开始倒计时,倒计时的时间值为终点值 减去 当前时间
  7. 如果用户关闭浏览器,再打开,需要获取localStorage时间,再与当前时间对比,超出则直接弹出,开始计算下一次的时间点,未超出,则继续倒计时,倒计时的值为终点值 减去 当前时间

2 代码实现 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            
        </style>
    </head>
    <body>
        <script>
            var myTime = 0;
            var timeExp = 1000*60*2; // 设定2分钟后继续打印
            // 第一次执行
            function first() {
                // 第一次就要弹框
                console.log('第一次弹框');
                // 第一次弹框把时间记录下来,记录的是下次打印的时间点
                var newDate = new Date().getTime() + timeExp;
                myTime = newDate;
                localStorage.setItem('t', newDate);
            }

            function timerFn() {
                // 对比localStorage,如果是第一次localStorage没有值,myTime为flase,first执行
                // 如果localStorage有值,myTime也有值了,first就不执行了
                myTime = localStorage.getItem('t');
                // 无记录,第一次开始执行
                if (!myTime) {
                    first();
                }
                // 执行完成一次后,不管刷新或者不刷新,myTime都有值了
                var newDate1 = new Date().getTime();
                if (newDate1 >= myTime) {
                    console.log('打印');
                    // 然后开始记录下次打印时间
                    myTime = newDate1 + timeExp;
                    localStorage.setItem('t', newDate1 + timeExp);
                    // 开始安装下次定时器
                    timerFn();
                } else { // 如果时间没过,稍后才到时间
                    // 看看还差多久才打印
                    var laterTime = myTime - newDate1;
                    setTimeout(() => {
                        console.log('打印');
                        // 然后开始记录下次打印时间
                        var newDate2 = new Date().getTime();
                        myTime = newDate2 + timeExp;
                        localStorage.setItem('t', newDate2 + timeExp);
                        // 开始安装下次定时器
                        timerFn();
                    }, laterTime)
                }
            }
            timerFn();
        </script>
    </body>
</html>

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经海路大白狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值