путаница по поводу setTimeout и clearTimeout - PullRequest
0 голосов
/ 29 сентября 2010

У меня есть кнопка, которая меняет фон 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 ]

7 голосов
/ 29 сентября 2010

Вы используете setTimeout и clearTimeout неправильно.Функция setTimeout возвращает дескриптор времени ожидания, который должен быть передан в clearTimeout, чтобы остановить его.

var playVTimeout;

...

    playVTimeout = setTimeout(playV, 2700);

....

    clearTImeout(playVTimeout);

Также обратите внимание, что setTimeout(playV(), 2700); вызовет playV() сейчас и выполнить его возвращаемое значение через 2,7 секунды.Вместо этого вы должны передать функциональный объект playV.

6 голосов
/ 29 сентября 2010

Назначьте переменную для setTimeout, которую затем передаете clearTimeout, чтобы очистить ее, т.е.

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

(обратите внимание, я добавил кавычки вокруг вашего первого аргумента setTimeout)

1 голос
/ 29 сентября 2010

Когда вы вызываете setTimeout, он возвращает числовое значение.Вы должны сохранить это значение, потому что это то, что вам нужно для clearTimeout.Так что следите за возвращаемым значением от обоих setTimeout (они будут отличаться).И отслеживайте их в области, к которой вы можете получить доступ из обеих функций.

Quick 'n' Dirty Пример:

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

Также вы вызываете setTimeout с помощью playV ()это неверно, так как он немедленно вызовет эту функцию таким образом.Вы можете оставить скобки позади, так что просто setTimeout( playV, 3500 );

...