2013-02-27 22 views
6

Mam proste chronograf JavaScript, który wyświetla na pola formularza o nazwie „d2”, służy do sprawdzenia, jak długo ktoś nabiera robi konkretnego zadania:setTimeout nie działa, gdy okno traci fokus

var milisec=0 
var seconds=0 
var complemento1="" 
document.form1.d2.value='00:00:00' 

function display(){ 
    if (milisec>=9){ 
     milisec=0 
     seconds+=1 
    } 
    else{ 
     milisec+=1 
    } 
    complemento1=complemento2=complemento3=""; 
    if ((seconds%60)<10) complemento1="0"; 
    if ((Math.floor(seconds/60)%60)<10) complemento2="0"; 
    if ((Math.floor(seconds/3600))<10) complemento3="0"; 
    document.form1.d2.value=complemento3+Math.floor(seconds/3600)+":"+complemento2+(Math.floor(seconds/60)%60)+":"+complemento1+(seconds%60) 
    setTimeout("display()",100) 
} 

Problem polega na tym, że gdy dana osoba otwiera nową kartę/używa innego programu, timer zatrzymuje się, a następnie wznawia działanie po ponownym ustawieniu okna (Korzystanie z Chrome). Ma najdziwniejsze zachowanie, ponieważ czasami działa, czasami nie.

Widziałem wiele postów, które wymagały skryptu do zatrzymania, gdy nie było fokusa, chcę dokładnie odwrotnie i szukałem przez ponad godzinę bez powodzenia. Twoja pomoc jest bardzo cenna!

+1

nitpick: zmienić linię setTimeout do 'setTimeout (wyświetlacz, 100)' , nie używaj łańcuchów, ponieważ powoduje to dodatkową ocenę. – epascarello

+0

możliwy duplikat [Jak mogę ustawić setInterval również, gdy karta jest nieaktywna w Chrome?] (Http://stackoverflow.com/questions/5927284/how-can-i-make-setinterval-also-work-when- a-tab-is-inactive-in-chrome) – epascarello

+7

Chrome automatycznie blokuje limity czasu i interwały, gdy zakładka nie jest skupiona, i nie sądzę, żebyś mógł wymusić, by zrobił inaczej, ale możesz łatwo obliczyć i zrekompensować rozbieżności , zwłaszcza jeśli obliczasz czas. Zamiast zakładać, że Twój limit czasu zostanie uruchomiony w ciągu następnych 100ms, zapisz bieżący czas i porównaj go z czasem, w którym upłynął limit czasu. – Mahn

Odpowiedz

3

Limity czasu oczekiwania na JavaScript nie są gwarantowane i nie zostaną wykonane o określonej godzinie. Na przykład, jeśli wątek jest zajęty czymś innym w momencie, gdy kończy się czas, najpierw zakończy to, co robi, a następnie wykona minutnik.

Również twoja funkcja nie bierze pod uwagę czasu spędzanego wewnątrz funkcji wyświetlania, więc małe opóźnienie zostanie dodane na każdą milisekundę.

Prawidłowy sposób wdrożenia licznika wykorzystuje czas systemowy.

Więc coś takiego:

//Call at the beggining to save the start time 
var start_time = new Date() 

// Compute seconds (does not matter when/how often you call it.) 
var milliseconds_since_start = new Date().valueOf() - start_time 

Obiekt Date można także formatować ten okres jako zegar dla Ciebie:

var m = new Date(milliseconds_since_start) 
m.getMinutes()+":"+m.getSeconds() 
Powiązane problemy