再次调用setTimeout会停止第一个实例

时间:2009-07-23 20:50:21

标签: javascript jquery settimeout

我在javascript中编写了一个简单的小游戏,可以从你点击的位置创建一个wave。我想出了两种让“波浪”在屏幕上移动的方法:

  1. 通过越来越多的时间调用jQuery.animate()。 demo
  2. 通过recursvely调用setTimeout。 demo
  3. 我遇到的问题是我想要2的行为(列都以相同的速度增长,偏移时间)但是动作为1(随后点击化合物形成“波浪”)。

    现在在第二个演示中,如果在“wave”完成之前再次单击,它会立即清除setTimeouts并重新启动它们。我希望能够像第一个例子那样堆叠它们。

    您可以查看其中任何一个页面的来源以查看代码(方法是getMouseXYUp和getMouseXYDown)。

    我在第二个演示中所做的基本要点是在这两个函数中找到的:

    function getMouseXYUp(e) {
                $("body").die('mousemove');
    
                h = (document.height - e.pageY + 17);
                    left = id-1;
                    right = id+1;
                setTimeout("moveleft()", 100);
                setTimeout("moveright()", 100);
    
                return true
            }
    
    function moveleft(){
            if (left >= 0){
                $("#div"+left).animate({'height': h}, 400);
                left--;
                setTimeout("moveleft()", 50);
            }
        }
    

2 个答案:

答案 0 :(得分:2)

问题是,只要第二次鼠标点击,您就会重置“左”和“右”变量。这有什么接近你想要的吗?

    function getMouseXYUp(e) {
        $("body").die('mousemove');

        var h = (document.height - e.pageY + 17);
        var left = id-1;
        var right = id+1;
        setTimeout(function() { moveleft(left, h); }, 100);
        setTimeout(function() { moveright(right, h); }, 100);

        return true;
    }

    ...

    function moveleft(left, h) {
        if (left >= 0){
            $("#div"+left).animate({'height': h}, 400);
            left--;
            setTimeout(function() { moveleft(left, h); }, 50);
        }
    }

    function moveright(right, h) {
        if (right < divs){
            $("#div"+right).animate({'height': h}, 400);
            right++;
            setTimeout(function () { moveright(right, h); }, 50);
        }
    }

答案 1 :(得分:0)

查看代码,看起来您遇到了全局变量问题。您需要在函数调用中向左和向右传递,而不是在全局范围内传递它。