Ripristino di un setTimeout


161

Ho il seguente:

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

Come posso, tramite una funzione .click, resettare il contatore a metà del conto alla rovescia?


Probabilmente puoi usare un'implementazione di rimbalzo esistente.
AturSams,

Risposte:


264

È possibile memorizzare un riferimento a quel timeout e quindi chiamare clearTimeoutquel riferimento.

// 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(...);

2
Così strano che non esiste un .clear()oggetto timeout stesso.
Automatico,

16
@ Cort3z perché window.setTimeoutrestituisce un numero (l'ID del timer) e non un "oggetto timeout".
Dan,

2
Sì @DanO: strano che setTimeout non restituisca un oggetto Timeout. In un contesto NodeJS lo fa.
Ki Jéy,

25

clearTimeout () e alimenta il riferimento di setTimeout, che sarà un numero. Quindi invocalo nuovamente:

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()
}

In questo esempio, se non si fa clic sull'elemento body in 5 secondi, il colore di sfondo sarà nero.

Riferimento:

Nota: setTimeout e clearTimeout non sono metodi nativi ECMAScript, ma metodi Javascript dello spazio dei nomi della finestra globale.


9

Dovrai ricordare il timeout "Timer", annullarlo, quindi riavviarlo:

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();
}

1
Interessante che questa opzione sia stata ignorata. Tutti gli altri sembrano richiedere la duplicazione della funzione interna del timer, che è meno che secca e dolorosa se ci sono più di poche righe di codice da mantenere due volte ...
brianlmerritt

8
var myTimer = setTimeout(..., 115000);
something.click(function () {
    clearTimeout(myTimer);
    myTimer = setTimeout(..., 115000);
}); 

Qualcosa del genere!


2

Questo timer emetterà una finestra di avviso "Hello" dopo 30 secondi. Tuttavia, ogni volta che si fa clic sul pulsante Reimposta timer cancella TimerHandle, quindi si ripristina nuovamente. Una volta sparato, il gioco 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>

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();

ecco un esempio elaborato di ciò che sta realmente succedendo su http://jsfiddle.net/ppjrnd2L/


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])} );

    })();

});

1

Per ripristinare il timer, è necessario impostare e cancellare la variabile timer

$time_out_handle = 0;
window.clearTimeout($time_out_handle);
$time_out_handle = window.setTimeout( function(){---}, 60000 );

25
Argh, sconsiglio di usare i nomi delle variabili di stile php in javascript. sì, funzionerà, ma mio Dio, è confuso.
psynnott,

0

so che questo è un vecchio thread, ma mi è venuto in mente oggi

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 invochi usando

afterTimer('<timername>string', <interval in milliseconds>int, function(){
   your code here
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.