Clearinterval JS之后的Setinterval重叠

时间:2018-07-18 11:39:40

标签: javascript

故事是一个坠落的气球。如果您设法单击气球(“停止”功能),您将获胜。否则,如果下降450像素,您将输掉。

问题是当我按下气球时:它更改了src,提醒我并清除clearInterval-现在我认为它将停止或等待下一个事件。 但是,在警报上单击“确定”后,警报持续下降...

我的代码:

function Start() {
    num = Math.floor(Math.random() * 501);
    document.getElementById("balon").style.left = num + 'px';
    var id = setInterval(function() {
        if (posX > 450 && ok) {
            alert("Looser");
            clearInterval(id);
        } else {
            posX += Vpos * dt;
            document.getElementById("balon").style.top = posX + 'px';
        }
    }, dt);
}

function Stop() {
    document.getElementById("balon").src = 'JS Pics/balon2.gif';
    alert("Winner");
    clearInterval(id);


}

最后,我找到了一种通过添加Bool变量来停止它的方法。见下文: 无论如何,我不确定为什么会发生这种情况(很乐于解释)或采用其他方法来解决此问题。感谢。

function Start() {
    num = Math.floor(Math.random() * 501);
    document.getElementById("balon").style.left = num + 'px';
    var id = setInterval(function() {
        if (posX > 450 && ok) {
            alert("Looser");
            clearInterval(id);
        } else {
            if (ok) {
                posX += Vpos * dt;
                document.getElementById("balon").style.top = posX + 'px';
            } else {
                clearInterval(id);
            }
        }
    }, dt);
}

function Stop() {
    ok = false;
    document.getElementById("balon").src = 'JS Pics/balon2.gif';
    alert("Winner");
    clearInterval(id);
}

1 个答案:

答案 0 :(得分:1)

idStart函数的范围内,因此在Stop函数的范围内未定义。
您可以在两个函数之外声明它,以便它们都可以访问它:

var id;

function Start() {
    num = Math.floor(Math.random() * 501);
    document.getElementById("balon").style.left = num + 'px';
    id = setInterval(function () {
        if (posX > 450 && ok) {
            alert("Looser");
            clearInterval(id);
        }
        else {
                posX += Vpos * dt;
                document.getElementById("balon").style.top = posX + 'px';
        }
    }, dt);
}

function Stop() {
    document.getElementById("balon").src = 'JS Pics/balon2.gif';
    alert("Winner");
    clearInterval(id);
}

您对ok的修复有效,因为您没有使用关键字var进行声明,因此将其分配给window对象(或者您在外部范围中声明了它,却忘记了附加在代码段中)。