混淆了setTimeout和clearTimeout

时间:2010-09-29 15:35:02

标签: javascript jquery settimeout

我有一个按钮,当它翻转时会改变div的背景。后台需要在计时器上更改,所以我使用setTimout来执行更改背景的方法。我认为clearTimeout会取消和我设置的超时,所以我把它放在mouseleave事件上。然而它似乎并没有停止超时。我的逻辑就在这里吗?

$("#h2Buzz").mouseenter(function () {   
   setTimeout(playV(), 2700);
   setTimeout(playP(), 5400);
}); 
$("#h2Buzz").mouseleave(function () {
   clearTimeout(playV());
   clearTimeout(playP());
});


function playV() {
    $("#ServicesBackgroundImage2").css("background-image", "url(/images/v.jpg)");
}
function playPn() {

    $("#ServicesBackgroundImage2").css("background-image", "url(/images/p.jpg)");
}

3 个答案:

答案 0 :(得分:7)

您错误地使用了setTimeoutclearTimeoutsetTimeout函数返回超时的句柄,该句柄将被传递到clearTimeout以停止它。

var playVTimeout;

...

    playVTimeout = setTimeout(playV, 2700);

....

    clearTImeout(playVTimeout);

另请注意,setTimeout(playV(), 2700);现在会调用playV() 并在2.7秒后执行其返回值。你应该传递一个函数对象playV

答案 1 :(得分:6)

将一个变量分配给setTimeout,然后传递给clearTimeout以清除它,即

var play_timeout = setTimeout("playV()", 2700);
clearTimeout(play_timeout);

(注意我在第一个setTimeout参数附近添加了引号)

答案 2 :(得分:1)

当您致电setTimeout时,它会返回一个数值。您应该存储此值,因为这是clearTimeout所需的。因此,要跟踪两个setTimeout的返回值(它们会有所不同)。并在可以从两个功能访问的范围内跟踪它们。

快'n'脏例子:

var timer = setTimeout( function(){ alert('hi'); }, 300 );
clearTimeout( timer );

另外,你用'playV()'调用setTimeout,这是不正确的,因为它会立即以这种方式调用该函数。您可以将括号放在后面,只需setTimeout( playV, 3500 );