我该如何等待一段时间然后更改变量?

时间:2012-01-30 04:53:04

标签: javascript jquery

我有一些使用jquery的代码,我想等待,300ms,然后更改变量。我尝试了setTimeout但它不起作用,它只是让变量立即改变。

setTimeout(animationWait = 0, 300);

(我在文档中全局定义了animationWait)基本上我要做的就是等待点击结束,然后才能完成另一次点击。所以我想我会设置一个变量然后等待300毫秒,

$('#up-arrow').live('click', function(e) {  

    if(animationWait == 0) {
        animationWait = 1;
        .... /* Code */
    }
}

因此我需要在延迟运行代码后再将animationWait更改回0。我已经尝试了很多东西,但它还没有用,有什么想法吗?

4 个答案:

答案 0 :(得分:5)

您没有正确使用setTimeout。必须传递函数名或匿名函数。

//anonymous function
setTimeout( function() { animationWait = 0 }, 300);

//or give it a function name
function change() { animationWait = 0; }
setTimeout(change, 300);

答案 1 :(得分:0)

您传递的参数应该是评估声明。对我来说这很好用:

var animationWait = -1;    //Initially set the value to -1
alert(animationWait);      //alert to see the value
setTimeout("animationWait = 0", 300);    //Setting the value to 0
setTimeout("alert(animationWait)", 400);  //Alert after 400 ms

答案 2 :(得分:0)

您是否尝试过使用jQuery函数delay()

标准用例看起来像这样:

$('item').delay(300).delayedEffectFunction();

delayedEffectFunction()是一个假装函数,你想要延迟。

答案 3 :(得分:0)

问题的答案是setTimeout()期望第一个参数是函数引用 - 在别处声明的函数的名称或匿名函数。 (或者是字符串,但由于使用字符串的几个原因几乎总是错误的解决方案。)您的代码只是执行表达式animationWait = 0并将该表达式(0)的结果传递给setTimeout()

因此,要通过setTimeout()执行单行代码,我建议将其包装在匿名函数中并将该函数传递给setTimeout()

setTimeout(function(){ animationWait = 0; }, 300);

但是,如果你使用jQuery做动画,它的动画方法允许你传递一个回调函数,以便在动画结束时执行,所以你可以在那里进行这种类型的处理,而不是独立设置你自己的超时。例如,如果您的动画是这样的:

$("#someelement").animate({someproperty:"somevalue"},
                          300);

然后你可以添加一个在这个动画完成后调用的回调函数:

$("#someelement").animate(({someproperty:"somevalue"},
                          300,
                          function(){ animationWait = 0; });

在我看来,它比单独的setTimeout()调用更整洁,但它也更容易维护,因为只需要在一个地方指定持续时间,而不是必须将自己的超时同步到动画。

类似的语法适用于其他jQuery方法,如.fadeIn().hide()等。有关详细信息和示例,请参阅.animate() doco