2009-09-24 16 views
102

Mam następujący:Resetowanie setTimeout

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

Jak mogę, za pośrednictwem funkcji .Kliknij wyzerować licznik w połowie przez odliczanie?

+0

Prawdopodobnie można użyć istniejącej implementacji nieczułości. – zehelvion

Odpowiedz

182

Możesz zapisać odniesienie do tego limitu czasu, a następnie wywołać clearTimeout dla tego odniesienia.

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

Tak dziwne, że nie ma '.clear()' na samym obiekcie timeout. – Automatico

+9

@ Cort3z, ponieważ 'window.setTimeout' zwraca liczbę (identyfikator zegara), a nie" obiekt limitu czasu ". –

+0

Jesteś ratownikiem! Dziękuję bardzo!!! – wdanda

17

clearTimeout() i podaj referencję setTimeout, która będzie liczbą. Następnie ponownie powołać go:

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

W tym przykładzie, jeśli nie kliknij na elemencie ciała w 5 sekund kolor tła będzie czarny.

referencyjny:

Uwaga: setTimeout i clearTimeout nie są ECMAScript metod rodzimych, ale metody JavaScript światowego okna nazw.

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

Coś w tym stylu!

4

Trzeba pamiętać timeout "timera", wyłącz go, a następnie ponownie uruchom go:

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

Ciekawe, że ta opcja została zignorowana. Wszystkie pozostałe zdają się wymagać duplikowania wewnętrznej funkcji timera, co jest mniej niż suche i bolesne, jeśli istnieje więcej niż kilka linii kodu, które trzeba zachować dwukrotnie ... – brianlmerritt

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

    })(); 

}); 
2

Ten czasomierz będzie ogień "Hello" alertbox po 30 sekundach. Jednak za każdym razem, gdy klikniesz przycisk resetowania timera, kasuje on timerHandle, a następnie ponownie ustawia go ponownie. Po uruchomieniu gra się kończy.

<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

Aby wyzerować stoper, trzeba by ustawić i usunąć timer zmiennej

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

Argh, odradzam używanie nazw zmiennych stylu PHP w javascript . tak, to zadziała, ale mój Boże, to jest mylące. – psynnott