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

Odliczanie (od 10 do 1) JavaScript

VPS Starter Arubacloud
+1 głos
7,749 wizyt
pytanie zadane 16 maja 2016 w JavaScript przez TheVirus Początkujący (480 p.)
Witam, W jaki sposób mogę zrobić w javascript odliczanie? Na początek zrobiłem pętle for, ale ona jedynie wyświetla cyfry od 10 do 1. (kod : function odlicz() { for(var i=10; i >= 1; i--) { document.write(i); } } setInterval(odlicz(), 1000);


) Proszę o pomoc.

5 odpowiedzi

+2 głosów
odpowiedź 16 maja 2016 przez ScriptyChris Mędrzec (190,190 p.)
edycja 16 maja 2016 przez ScriptyChris

Są na to (co najmniej) dwa sposoby (ich opis może wydawać się zagmatwany, dlatego pod każdym zamieszczam kod dla rozjaśnienia):

  • tworzysz sztuczny iterator oraz funkcję (np. countDown), w której umieszczasz setInterval(), gdzie za każdym razem zmniejszasz sobie iterator - powstaje sztuczna pętla. W niej za każdym razem podmieniasz tekst w DIVie (albo innym elemencie HTML) i wywołujesz funkcję countDown dopóki iterator będzie większy od jedynki (albo wartości, do której ma liczyć)

Przykład: https://jsfiddle.net/Chriss92/7ancr9ug/1/

  • trudniejszy sposób, bo za pomocą pętli for i skorzystania z closure. Tworzysz pustą tablicę (np. timerArr[]). Robisz pętle wykonująca się od np. 10 do 1. Przy pierwszej iteracji (czyli dla i === 10) zapełniasz tablicę liczbami od 1 do 10 (tyle liczb, ile iteracji wykona pętla) i odwracasz tablicę resultArr.reverse() - powód wypełniania tablicy i jej odwracania wyjaśnię pod koniec. Później tworzysz sobie IIFE, do którego podajesz iterator głównej pętli, a w nim wykonujesz setTimeout(), we wnętrzu którego po prostu wyświetlasz w DIVie aktualną wartość iteratora (zachodzi tutaj zjawisko domknięcia - closure - dlatego mimo pętli, wewnątrz setTimeout widoczny jest aktualny iterator, a nie ten po zakończeniu pętli). Co do setTimeout - z uwagi na to, że chcesz odliczanie od wyższej liczby do niższej, nie możesz jako czas wywołania podać mu ani ilości czasu (bo w jednym czasie uzyskasz zakres wszystkich liczb, a chcesz po prostu odliczanie), ani ilości czasu pomnożonej przez wartość iteratora (bo uzyskasz odliczanie od 0 do końca, czyli odwrotnie niż chcesz). Tutaj trzeba skorzystać z odwróconych wartości iteratora, bo odliczasz od góry do dołu - dlatego korzystasz sobie z pomocniczej tablicy, która posiada wartości iteratora w odwrotnej kolejności. Wiem, że brzmi zagmatwanie, ale mam nadzieję, że kod to rozjaśni.

Przykład: https://jsfiddle.net/Chriss92/vy3g0wmq/

komentarz 14 listopada 2017 przez Wojtek Janiak Nowicjusz (170 p.)
Cześć.
 Pierwszy z przykładów nie działa poprawnie na liczby większej niż 15.

Pytanie do 2 przykładu.
W którym miejscu wstawić alert, żeby po odliczeniu od 30 wyskoczył alert('koniec czasu')?
Próbowałem już wiele razy, ale nadal nie rozumiem mechaniki tego skryptu.
komentarz 15 listopada 2017 przez ScriptyChris Mędrzec (190,190 p.)

Pierwszy z przykładów nie działa poprawnie na liczby większej niż 15.

Po czym to stwierdzasz?

W którym miejscu wstawić alert, żeby po odliczeniu od 30 wyskoczył alert('koniec czasu')? 

Możesz go umieścić w if z warunkiem idx === 1 pod res.innerHTML = idx.

 

0 głosów
odpowiedź 16 maja 2016 przez LCPGM Obywatel (1,550 p.)
Co masz na myśli pod odliczaniem? Pokazywanie cyfr to chyba właśnie to. Opisz dokładniej o co ci chodzi to postaram się pomóc.
komentarz 16 maja 2016 przez TheVirus Początkujący (480 p.)
Chodzi o to, żeby na ekranie najpierw wyświetlona została liczba 10, potem 9, 8 itp. Nie obok siebie, tylko jedna po drugiej.
komentarz 16 maja 2016 przez LCPGM Obywatel (1,550 p.)
Złap jakiś element HTML i używaj innerHTML, aby podmienić jego zawartość za każdą pętlą w funkcji.
0 głosów
odpowiedź 16 maja 2016 przez Ehlert Ekspert (213,860 p.)
  1. Robisz akapit z liczbą 10
  2. otwierasz stronę
  3. Pobierasz liczbę z akapitu
  4. Jeśli jest większa od 1 odejmujesz od niej jeden i podstawiasz do akapitu.
  5. czekasz 1000 ms (setTimeout((f(){}), 1000); )
  6. Idź do pkt 3.
0 głosów
odpowiedź 16 maja 2016 przez Orkoo7 Bywalec (2,670 p.)
Jeżeli dobrze zrozumiałem pytanie, to można takie odliczanie zrobić w ten sposób:

JS:

 window.onload = zacznij_odliczac;
        var liczba = 10;
    function zacznij_odliczac()
        {
           document.getElementById("liczby").innerHTML = liczba;
            liczba = liczba-1;

            if(liczba<0) liczba = 10;
            setTimeout("zacznij_odliczac()",1000);
        }

HTML: <div id="liczby"></div>

Dajesz zmiennej liczba wartość 10, a w funkcji zmniejszasz ją co sekunde o 1 i wyświetlasz dzięki innerHTML , gdy liczba dojdzie do zera, 'resetuje' się licznik. Mam nadzieję , że pomogłem :)
komentarz 16 maja 2016 przez ScriptyChris Mędrzec (190,190 p.)

Spoko, ale window.onload jest tu zbędne (można zastąpić choćby IIFE). Funkcja setTimeout() przyjmuje jako parametr funkcje (może być anonimowa), nie przekazuj jej stringa: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

Poza tym Twój skrypt odlicza do 0 i powtarza odliczanie od 10, czyli działa w kółko.

komentarz 16 maja 2016 przez Orkoo7 Bywalec (2,670 p.)
Zawsze można dodać if'a sprawdzającego :)
–1 głos
odpowiedź 16 maja 2016 przez Bartosz Pajewski Początkujący (480 p.)
i=10

zamień na i=1000 ( ewentualnie podstaw sobie zmienną, która Ci da możliwość wprowadzania dowolnej liczby)

Podobne pytania

0 głosów
1 odpowiedź 1,364 wizyt
pytanie zadane 4 lipca 2019 w JavaScript przez czarli.w Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 1,091 wizyt
pytanie zadane 2 marca 2017 w JavaScript przez Xamingo Nowicjusz (160 p.)
0 głosów
4 odpowiedzi 10,952 wizyt

92,963 zapytań

141,928 odpowiedzi

321,161 komentarzy

62,297 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...