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

Pętla w javascript.

+1 głos
108 wizyt
pytanie zadane 17 lutego w JavaScript, jQuery, AJAX przez lukaszlukasz Nowicjusz (130 p.)

Witam. Napisałem taki kod, który niestety wygląda jakby wpadał w nieskończoną pętle lub coś w tym stylu, gdyż program zamiast co sekundę odliczać od podanej wartości do 0 to działa tak, że po sekundzie pokazuje się na ekranie 0 ;) .

Ma ktoś pomysł w czym może tkwić błąd? 

function pobieranie()
{
    var podana_wartosc;
    podana_wartosc = document.getElementById("pole").value;
   
    licznik=podana_wartosc;
    for( var i=0; i<licznik;i++)
        {
            setTimeout(function(){document.getElementById("wyswietlacz").innerHTML = podana_wartosc;}, 1000);
            podana_wartosc=podana_wartosc-1;
        }
}

Przestawiam się z cpp na js, na razie idzie ciężko ;) 

2 odpowiedzi

0 głosów
odpowiedź 17 lutego przez Ehlert Szeryf (90,230 p.)

Ja dla pewności licznik potraktowałbym parseInt. A tak na przyszłość:

  1. Klikamy F12 (albo zbadaj element)
  2. Zakładka Sources, po polsku chyba Źródło?
  3. Otwieramy z panelu po lewej plik JS.
  4. Klikamy numer linijki gdzie mamy się zatrzymać.
  5. Wywołujemy skrypt (przeładowanie strony/kliknięcie button itp)
  6. Po kodzie poruszamy się przyciskami Step intoStep overStep out
  7. Dodatkowo mamy okienko Watch gdzie jak klikniemy Add expression to możemy obserwować wartości zmiennych wink

Słowem Debugowanie.

komentarz 17 lutego przez Ehlert Szeryf (90,230 p.)

Licznik został zadeklarowany bez var. Chyba, że to coś publicznego.

komentarz 17 lutego przez Ehlert Szeryf (90,230 p.)

Nie chcę Ci mówić gdzie masz błąd, ale to że umieściłeś setTimeout w forze nie znaczy że jedna iteracja trwa 1000ms cheeky cała pętla wykonuje się w mniej niż sekundę prawdopodobnie. 

komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
Dzięki za odpowiedź. tzn, używałem już debugera w chromie (nie do końca jeszcze ogarniam wszystkie funkcje), ale nic nie udało mi się wykryć ;)

Tak, brakuje tam var, niestety nie zmienia to działania programu.
komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
Taki podjąłem trop, że to coś z tą setTimeout, jednak z jej specyfikacji wynika, że zadana funckja wykona się po podanym czasie, więc nie rozumiem dlaczego wykonuje się szybciej :o
komentarz 17 lutego przez Ehlert Szeryf (90,230 p.)
For nie będzie czekać na Twojego setTimeouta.
komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
W tym rzecz, problem zdiagnozowany,teraz tylko potrzeba nowego rozwiązania problemu :)
komentarz 17 lutego przez Ehlert Szeryf (90,230 p.)

Poczytaj o rekurencji i tam wywołaj setTimeout cheeky

komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
chodzi o funkcje rekurencyjny, by wywoływały się nawzajem, i wtedy pierwsza funkcja będzie czekała z wykonaniem drugiej na tego setTimeouta, a nie tak jak for ;) ? Dobrze rozumiem?
komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
Dobra, nie zawracam głowy, posprawdzam ;) Dzieki za odpowiedzi
0 głosów
odpowiedź 17 lutego przez obl Pasjonat (23,580 p.)

Zobacz co się dzieje, najpierw robisz tą pętlę, której wykonanie trwa ułamek sekundy, w tym czasie uruchamiasz zegar, żeby po sekundzie ci uruchomił jakąś tam funkcję która wyświetli zmienną podana_wartosc. Ale twoja pętla w tym czasie odliczy już do 0 i ustawi wartość zmiennej podana_wartość na 0 i dlatego od pierwszego wywołania funkcji nic się nie dzieje.

Poza tym parseInt jak napisał @Ehlert bo pod tym polem formularza może być tekst. Później jeszcze trzeba sprawdzić czy nie zwróciło NaN (bo to zwraca, gdy podana wartość nie jest liczbą).

komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
Dzięki! Wychodziłem z założenia, że kolejna iteracja następuje dopiero po wykonaniu się tego odstępu czasowego. Teraz pozostaje mi tylko wymyślić, jak zrobić to w inny sposób, jakieś wskazówki mile widziane :)

Dzięki za uwagi o NaN
komentarz 17 lutego przez obl Pasjonat (23,580 p.)
edycja 17 lutego przez obl

Spróbuj tak (mniej więcej powinno działać):

var podana_wartosc = 0;

function timer(){ document.getElementById("wyswietlacz").innerHTML = podana_wartosc; podana_wartosc=podana_wartosc-1;
setTimeout(timer, 1000);
}

function pobieranie(){
    podana_wartosc = parseInt(document.getElementById("pole").value);
    if(podana_wartosc !== NaN){
    timer();
    }
}

Zapomniałem o wywołaniu timera w funkcji :)

komentarz 17 lutego przez lukaszlukasz Nowicjusz (130 p.)
super działa, dzięki.

Podobne pytania

0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 17 stycznia w JavaScript, jQuery, AJAX przez mowmiheniek Stary wyjadacz (11,740 p.)
0 głosów
1 odpowiedź 51 wizyt
pytanie zadane 22 maja w JavaScript, jQuery, AJAX przez jaco Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 133 wizyt
pytanie zadane 12 lutego w JavaScript, jQuery, AJAX przez Muhin Obywatel (1,440 p.)

35,172 zapytań

71,376 odpowiedzi

136,425 komentarzy

17,049 pasjonatów

Przeglądających: 122
Pasjonatów: 5 Gości: 117

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...