Redefinindo um setTimeout

161

Eu tenho o seguinte:

window.setTimeout(function() {
    window.location.href = 'file.php';
}, 115000);

Como, através de uma função .click, redefinir o contador no meio da contagem regressiva?

Jason
fonte
Você provavelmente pode usar uma implementação de rejeição existente.
AturSams 21/03

Respostas:

264

Você pode armazenar uma referência a esse tempo limite e, em seguida, chamar clearTimeoutessa referência.

// in the example above, assign the result
var timeoutHandle = window.setTimeout(...);

// in your click function, call clearTimeout
window.clearTimeout(timeoutHandle);

// then call setTimeout again to reset the timer
timeoutHandle = window.setTimeout(...);
bdukes
fonte
2
Tão estranho que não existe um .clear()objeto de tempo limite em si.
Automatico
16
@ Cort3z é porque window.setTimeoutretorna um número (o ID do temporizador) e não um "objeto de tempo limite".
Dan O
2
Sim @ DanO: estranho que setTimeout não retorna um objeto Timeout. Em um contexto NodeJS, ele faz.
Ki Jéy
25

clearTimeout () e alimente a referência do setTimeout, que será um número. Então, invoque-o novamente:

var initial;

function invocation() {
    alert('invoked')
    initial = window.setTimeout( 
    function() {
        document.body.style.backgroundColor = 'black'
    }, 5000);
}

invocation();

document.body.onclick = function() {
    alert('stopped')
    clearTimeout( initial )
    // re-invoke invocation()
}

Neste exemplo, se você não clicar no elemento body em 5 segundos, a cor do plano de fundo será preta.

Referência:

Nota: setTimeout e clearTimeout não são métodos nativos do ECMAScript, mas métodos Javascript do espaço para nome da janela global.

meder omuraliev
fonte
9

Você precisará se lembrar do tempo limite "Timer", cancelá-lo e reiniciá-lo:

g_timer = null;

$(document).ready(function() {
    startTimer();
});

function startTimer() {
    g_timer = window.setTimeout(function() {
        window.location.href = 'file.php';
    }, 115000);
}

function onClick() {
    clearTimeout(g_timer);
    startTimer();
}
Frank Krueger
fonte
1
Interessante que esta opção tenha sido ignorada. Os outros todos parecem exigir a função timer interno a ser duplicado, que é menos de seca e dolorosa, se houver mais do que algumas linhas de código para manter a duas vezes ...
brianlmerritt
8
var myTimer = setTimeout(..., 115000);
something.click(function () {
    clearTimeout(myTimer);
    myTimer = setTimeout(..., 115000);
}); 

Algo nesse sentido!

Deniz Dogan
fonte
2

Este timer disparará uma caixa de alerta "Olá" após 30 segundos. No entanto, sempre que você clica no botão de redefinição do timer, ele limpa o timerHandle e o redefine novamente. Depois de disparado, o jogo termina.

<script type="text/javascript">
    var timerHandle = setTimeout("alert('Hello')",3000);
    function resetTimer() {
        window.clearTimeout(timerHandle);
        timerHandle = setTimeout("alert('Hello')",3000);
    }
</script>

<body>
    <button onclick="resetTimer()">Reset Timer</button>
</body>
kaleazy
fonte
2
var redirectionDelay;
function startRedirectionDelay(){
    redirectionDelay = setTimeout(redirect, 115000);
}
function resetRedirectionDelay(){
    clearTimeout(redirectionDelay);
}

function redirect(){
    location.href = 'file.php';
}

// in your click >> fire those
resetRedirectionDelay();
startRedirectionDelay();

aqui está um exemplo elaborado para o que realmente está acontecendo http://jsfiddle.net/ppjrnd2L/

Biskrem Muhammad
fonte
1
$(function() {

    (function(){

        var pthis = this;
        this.mseg = 115000;
        this.href = 'file.php'

        this.setTimer = function() { 
            return (window.setTimeout( function() {window.location.href = this.href;}, this.mseg));
        };
        this.timer = pthis.setTimer();

        this.clear = function(ref) { clearTimeout(ref.timer); ref.setTimer(); };
        $(window.document).click( function(){pthis.clear.apply(pthis, [pthis])} );

    })();

});
andres descalzo
fonte
1

Para redefinir o timer, você precisa definir e limpar a variável do timer

$time_out_handle = 0;
window.clearTimeout($time_out_handle);
$time_out_handle = window.setTimeout( function(){---}, 60000 );
Anwasi Richard Chibueze
fonte
25
Agora, eu aconselho a não usar nomes de variáveis ​​de estilo php em javascript. sim, vai funcionar, mas meu Deus, é confuso.
psynnott
0

Eu sei que este é um tópico antigo, mas eu vim com isso hoje

var timer       = []; //creates a empty array called timer to store timer instances
var afterTimer = function(timerName, interval, callback){
    window.clearTimeout(timer[timerName]); //clear the named timer if exists
    timer[timerName] = window.setTimeout(function(){ //creates a new named timer 
        callback(); //executes your callback code after timer finished
    },interval); //sets the timer timer
}

e você invoca usando

afterTimer('<timername>string', <interval in milliseconds>int, function(){
   your code here
});
Clint
fonte