• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zegarek w JavaScript - funkcja setTimeout() się nie wykonuje

Object Storage Arubacloud
0 głosów
1,277 wizyt
pytanie zadane 1 września 2017 w JavaScript przez maciek061 Gaduła (4,490 p.)

Witam, stworzyłem zegarek dokładnie tak, jak jest pokazane na kursie pana Zelenta. Wszystko działało. 

Potem chciałem dodać drugi zegarek linijkę niżej, z tym że ten drugi liczyłby czas od zera. I wciąż cały kod się wykonuje, tylko ostatnie polecenie setTimeout() nie działa, więc zegarki "nie chodzą". Skrypt poniżej. 

<script type="text/javascript">


window.onload = start;

function start()
{
	zegarek(0,0,0);
}

function zegarek(Qgodzina,Qminuta,Qsekunda)
{
	
	var dzisiaj = new Date();
	
	var godzina = dzisiaj.getHours(); if(godzina<10) godzina="0"+godzina;
 	var minuta = dzisiaj.getMinutes(); if(minuta<10) minuta="0"+minuta;
	var sekunda = dzisiaj.getSeconds(); if(sekunda<10) sekunda="0"+sekunda;
	
	document.getElementById("z").innerHTML = 
	godzina + ":" + minuta + ":" + sekunda;
	
	if(Qminuta==59 && Qsekunda==59)
	{
		Qgodzina++;
		Qminuta=0; Qsekunda=0;
	}
	else if(Qsekunda==59)
	{
		Qminuta++;
		Qsekunda=0;
	}
	else Qsekunda++;
	
	document.getElementById("q").innerHTML = 
	Qgodzina+":"+Qminuta+":"+Qsekunda;
	
	setTimeout("zegarek(Qgodzina,Qminuta,Qsekunda)", 1000); 

}

</script>

 

Z góry dzięki za pomoc. 

komentarz 1 września 2017 przez ScriptyChris Mędrzec (190,190 p.)

Gdzie jest ten drugi "zegarek"?

Do setTimeout przekazuj referencję funkcji lub twórz tam funkcję anonimową i wewnątrz niej swój kod. Nie przekazuj tam stringa, bo kod będzie puszczony przez eval, co jest złą praktyką.

Czy w konsoli są jakieś błędy?

komentarz 1 września 2017 przez maciek061 Gaduła (4,490 p.)

Czyli co mam zmienić? Co to znaczy przekazuj referencję funkcji lub twórz tam funkcję anonimową i wewnątrz niej swój kod? Jestem jeszcze zielony. 

komentarz 1 września 2017 przez maciek061 Gaduła (4,490 p.)

 A w konsoli jest tak:

Uncaught ReferenceError: Qgodzina is not defined
    at <anonymous>:1:9

komentarz 1 września 2017 przez ScriptyChris Mędrzec (190,190 p.)

Referencję do funkcji przekazujesz, gdy jako parametr przesyłasz nazwę funkcji. Tak jak w przypadku obiektów. Funkcje w JavaScript są obiektami, co oznacza że możesz przypisywać im propertisy (pole i metody) - lecz funkcje cechują się tym, że możesz wywołać kod umieszczony w ich ciele. Posiadają też inne "ficzery", ale o tym sobie poczytaj w dokumentacji.

komentarz 1 września 2017 przez maciek061 Gaduła (4,490 p.)
przywrócone 1 września 2017 przez maciek061
W ogóle to jest problematyczne, no bo jak chciałbym dopisać "0" do zmiennych mniejszych od 10 (żeby było 19:00 a nie 19:0) to te zmienne przestaną być int'ami i nie będzie można prowadzić na nich operacji matematycznych.
komentarz 1 września 2017 przez ScriptyChris Mędrzec (190,190 p.)
edycja 1 września 2017 przez ScriptyChris

W ogóle to jest problematyczne, no bo jak chciałbym dopisać "0" do zmiennych 

Operator dodawania, jeśli w operacji uczestniczą wartości typu string, wykonuje konkatenację, czyli łączenie łańcuchów znaków. Aby temu zaradzić rzutuj sobie wartości numeryczne, które masz zapisane jako string, na typ number (np. parseInt, parseFloat), albo po prostu zapisuj liczby jako number.

komentarz 1 września 2017 przez maciek061 Gaduła (4,490 p.)

Tak to zrobiłem

setTimeout(function() { 
zegarek( parseInt(Qgodzina), parseInt(Qminuta), 
parseInt(Qsekunda) );}, 1000);

 

1 odpowiedź

+1 głos
odpowiedź 1 września 2017 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 1 września 2017 przez maciek061
 
Najlepsza

Uncaught ReferenceError: Qgodzina is not defined 
    at <anonymous>:1:9

To jest efekt uboczny użycia eval. Zmienna Qgodzina i reszta, która przekazywana jest do funkcji zegarek była przesłana z funkcji start, a więc wartości te nie należą do globalnego scope (zostały utworzone lokalnie). Natomiast korzystając z eval JavaScript próbował szukać tych zmiennych w global scope.

Dlatego przekaż do setTimeout funkcję anonimową, w której wywołasz funkcję zegarek z parametrami:

setTimeout(function() { 
    zegarek(Qgodzina,Qminuta,Qsekunda);
}, 1000);
komentarz 1 września 2017 przez maciek061 Gaduła (4,490 p.)
Aha, już skumałem. Działa, Dzięki za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 501 wizyt
0 głosów
1 odpowiedź 227 wizyt
pytanie zadane 6 października 2022 w JavaScript przez Przemek12 Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 673 wizyt
pytanie zadane 18 sierpnia 2021 w JavaScript przez adek236 Nowicjusz (180 p.)

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...