【问题标题】:clearInterval is not clearing setIntervalclearInterval 没有清除 setInterval
【发布时间】:2016-03-14 01:26:36
【问题描述】:

我做了一个记忆游戏,计时器从 10 分钟开始,每秒倒数到 0。这个函数只调用一次,并且有以下 setInterval 函数:

game.countdown = setInterval(function() {
                    if(game.timeLeft <= 0){
                        gameEnded = true;
                    }

                    if(!gameEnded){
                        // lower one second
                        game.timeLeft--;

                        var timespan = document.querySelector('.timeleft');

                        var minutes =  pad(Math.floor((game.timeLeft / 60)),2 );
                        var newSeconds =  pad(Math.floor(game.timeLeft - (minutes * 60)),2 );

                        function pad(num, size) {
                            var s = num+"";
                            while (s.length < size) s = "0" + s;
                            return s;
                        }

                        var niceTime = minutes + ":" + newSeconds;

                        timespan.innerHTML = niceTime;

                        // Then alter time bar on .innertimer
                        // Calculate percentage starting at 0%
                        var percentageDone = (Math.floor((10*60 - game.timeLeft) / (10*60) * 10000) / 100);
                        $(".timer").css({"background": "-webkit-linear-gradient(left, white " + percentageDone + "%, green " + percentageDone + "%)"});
                    }
                }, 1000);

我将 setInterval 存储在对象游戏中的变量名倒计时下。当游戏结束时,我调用另一个具有 clearInterval 的函数:

clearInterval(game.countdown);

然后当它进入下一个级别时,它会再次调用 setInterval 函数并将其再次存储在 game.countdown 中。但是现在每秒需要 2 秒。下一级3秒。您可以看到有多个 setInterval 在工作,因为它不是同时完成的。

希望有人能真正帮助我调试这个问题。

【问题讨论】:

  • 您确定正在呼叫clearInterval 吗?可能有助于了解发生这种情况的逻辑。
  • 我在 clearInterval 和 clearInterval 被调用之前的行添加了一条警告。如果我做 alert("game.countdown:" + JSON.stringify(game.countdown, null, 4));然后在第一级它给出未定义的。它在 setInterval 之前。然后第二级给出 1,第三级给出 5。
  • 是否有可能 setInterval 最初被触发两次,以便在调用 clearInterval 时只调用 clear 间隔之一?您可以通过在 setInterval 回调中抛出一些 console.log() 跟踪语句来测试它。

标签: javascript jquery setinterval clearinterval


【解决方案1】:

我为解决此问题所做的工作如下。仅当满足以下条件时才调用间隔:

if (undefined == game.countdown){

这样,如果定义了倒计时,它会再次调用它。由于我将 game.timeLeft 存储在函数本身中,因此我可以重新填充 game.timeLeft。

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多