Javascript setInterval在第二次调用后不停止

Javascript setInterval在第二次调用后不停止,javascript,jquery,setinterval,Javascript,Jquery,Setinterval,我目前正在研究一个作战系统。 健康度每200ms计算一次,我使用的是间隔时间。在我再次开始比赛之前,这一切都很好。它不再停止 这是很多代码-我也有一个在线现场演示在这里 就像我说的-第一个有效,但第二个无效 因此,只需输入主代码: var frameStop; // Draws Startscreen function showStartRaid(name) { playerBTC = btc; player

我目前正在研究一个作战系统。 健康度每200ms计算一次,我使用的是间隔时间。在我再次开始比赛之前,这一切都很好。它不再停止

这是很多代码-我也有一个在线现场演示在这里

就像我说的-第一个有效,但第二个无效

因此,只需输入主代码:

var frameStop;
 // Draws Startscreen
    function showStartRaid(name) {               
            playerBTC = btc;
            playerBTCs = btcs;
            playerName = nick;

            // Sets stats for called level
            enemyBTC = dun[name]["buyer"]["btc"];
            enemyBTCs = dun[name]["buyer"]["btcs"];
            enemyName = dun[name]["buyer"]["label"];   
            enemyNum = dun[name]["meta"]["base"];         

            /* Reset everything in html */
    }

    var battle = false;

    $(".raid_building").click(function() {           
        //Draws level
        showStartRaid(name);

        //Sets start BTC as fighting stats (they will decrease during battle)
        fplayerBTC = playerBTC;
        fenemyBTC = enemyBTC;
        //Click on "Start"
        $("#startRaid").click(function() {
            function raiden() {
                //Calculates fighting
                fenemyBTC -= playerBTCs/frameMinus;
                fplayerBTC -= enemyBTCs/frameMinus;

                /*Draws stats and health here in html */

                if(fplayerBTC >= 0 && fenemyBTC >= 0)
                    console.log("battle goes on")
                else {
                    //If battle is over, stop it
                    clearInterval(frameStop);
                }
            }
            //Start battle
            frameStop = setInterval(raiden, frameRaid);
        });
    });
谢谢你的帮助,我很无助。

有了你的代码,每次点击
.raid\u building
,你都会连接一个新的处理程序来点击
\startRaid
。这意味着,如果两次单击
.raid\u building
,您将有两个处理程序用于单击
#startRaid
,这两个处理程序都将启动一个新的间隔计时器。
frameStop
变量将只包含其中一个的句柄;另一个将继续。当然,第三次单击会使问题复杂化(您将有三个
click
处理程序,每个处理程序都会触发一个新的间隔计时器)。等等

#startRaid
上的代码挂接
点击
移动到
.raid#u building
上的点击处理程序外部
使用您的代码,每次点击
.raid#startRaid
时,您都会挂接一个新的点击处理程序。这意味着,如果两次单击
.raid\u building
,您将有两个处理程序用于单击
#startRaid
,这两个处理程序都将启动一个新的间隔计时器。
frameStop
变量将只包含其中一个的句柄;另一个将继续。当然,第三次单击会使问题复杂化(您将有三个
click
处理程序,每个处理程序都会触发一个新的间隔计时器)。等等

#startRaid
上的代码挂接
点击
移动到
.raid#u building
上的点击处理程序外部
使用您的代码,每次点击
.raid#startRaid
时,您都会挂接一个新的点击处理程序。这意味着,如果两次单击
.raid\u building
,您将有两个处理程序用于单击
#startRaid
,这两个处理程序都将启动一个新的间隔计时器。
frameStop
变量将只包含其中一个的句柄;另一个将继续。当然,第三次单击会使问题复杂化(您将有三个
click
处理程序,每个处理程序都会触发一个新的间隔计时器)。等等

#startRaid
上的代码挂接
点击
移动到
.raid#u building
上的点击处理程序外部
使用您的代码,每次点击
.raid#startRaid
时,您都会挂接一个新的点击处理程序。这意味着,如果两次单击
.raid\u building
,您将有两个处理程序用于单击
#startRaid
,这两个处理程序都将启动一个新的间隔计时器。
frameStop
变量将只包含其中一个的句柄;另一个将继续。当然,第三次单击会使问题复杂化(您将有三个
click
处理程序,每个处理程序都会触发一个新的间隔计时器)。等等


#startRaid上的代码挂钩
单击
移动到
上的单击处理程序外部raid\U building

我还想补充一点,您可以将其留在内部,但可以执行一个
.off('click')。打开('click'
,虽然我不推荐它。@Adammerfield:的确,这是很好的观点。有时这正是你想要的。可能不在这里,但仍然…我还想补充一点,你可以把它放在里面,但可以关闭('click')。打开('click'
,虽然我不推荐它。@Adammerfield:的确,这是很好的观点。有时这正是你想要的。可能不在这里,但仍然…我还想补充一点,你可以把它放在里面,但可以关闭('click')。打开('click',虽然我不推荐它。@Adammerfield:的确,这是很好的观点。有时这正是你想要的。可能不在这里,但仍然…我还想补充一点,你可以把它放在里面,但可以关闭('click')。打开(“单击”,尽管我不推荐它。@Adammerfield:的确,这是一个很好的观点。有时这正是你想要的。可能不在这里,但仍然。。。