od Podstaw
9 godz. 20 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperJavaScript to język programowania, który napędza niemal wszystkie strony internetowe. Dopełnia on technologie HTML i CSS, za pomocą których tworzymy strukturę i wygląd dokumentu. Co jednak w sytuacji, gdy chcemy po kliknięciu w wybrany przycisk wyświetlić powiększone zdjęcie lub wczytać dodatkowe dane z serwera? To właśnie w takich sytuacjach przydaje się język JavaScript i tzw. DOM API, dostępne w przeglądarce. Jak się przekonasz, możliwości nowoczesnych przeglądarek w połączeniu z tym językiem są naprawdę ogromne.
Język JavaScript może być używany nie tylko na stronach internetowych. Z tego powodu, w kursie omówimy najpierw najważniejsze konstrukcje tego języka, które są niezależne od platformy uruchomieniowej. Dzięki temu zbudujesz fundamenty niezbędne do tego, by wykorzystać ten język np. w środowisku Node.js. Krok po kroku omówimy sposoby tworzenia zmiennych, dostępne typy danych i operatory. Następnie zobaczysz jak tworzyć tablice i obiekty, z jakich instrukcji warunkowych i pętli możesz korzystać, a także jak tworzyć własne funkcje. Przekazywana wiedza uwzględniać będzie nowości, które pojawiły się w języku wraz z rewolucyjnym standardem EcmaScript 6 (ES6).
Sam język JavaScript to nie wszystko, by tchnąć ducha w strony internetowe. Z tego powodu, przeglądarki internetowe udostępniają tzw. DOM API. To interfejs, który z użyciem języka JavaScript pozwala na manipulację treścią i wyglądem strony. W kursie bardzo dokładnie omówimy czym jest Obiektowy Model Dokumentu, a także jak z nim pracować. Zobaczysz jak tworzyć nowe elementy HTML i wstawiać je na stronę, jak modyfikować ich treść, atrybuty, style czy klasy CSS. Poznasz sposoby na odczytywanie położenia elementu na stronie i jego wymiarów, które będą niezbędne w wielu sytuacjach. Dowiesz się także, jak przypisywać obsługę zdarzeń w przeglądarce, by np. wywołać własną funkcję, gdy ktoś kliknie w wybrany przez Ciebie przycisk.
JSON to popularny format wymiany danych, a Ajax to potoczna nazwa dla asynchronicznych zapytań HTTP, które wysyłać możemy z poziomu kodu JavaScript. Dziś niemal każda strona internetowa wykorzystuje te technologie. W niektórych przypadkach jako dopełnienie podstawowej funkcjonalności witryny, a w innych jako główny motor napędzający stronę. Jeśli kiedykolwiek widziałeś, jak na stronie internetowej jakaś treść "doczytuje" się np. podczas przewijania - widziałeś w praktyce Ajax. W jednym z rozdziałów kursu zobaczysz, jak pracować z tym formatem, a także jak wysyłać wspomniane zapytania do serwera.
Choć kurs który masz przed sobą, jest kursem dla początkujących, to aby zrozumieć jak działa język JavaScript i jak z nim się współcześnie pracuje, omówimy dwa ważne tematy - zarządzanie zależnościami i bundlowanie kodu. Dowiesz się czym jest npm i jak z jego pomocą pobierać paczki gotowego kodu z internetu, a także jak sprawić, by bez trudnu dołączać je do własnego kodu. W tym celu skorzystamy z narzędzia snowpack, które pozwoli nam także na optymalizację kodu przed jego wypuszczeniem w świat. Na tym etapie omówimy również jak działają moduły ESM, pozwalające dzielić kod na mniejsze części.
Kurs podzielony został na możliwie krótkie lekcje, do których w każdej chwili możesz wrócić. Jeśli zatem zapomnisz jak odczytywać wymiary elementu na stronie, szybko odnajdziesz odpowiednią lekcję. Czym jednak była by sama teoria i proste przykłady, bez pokazania, jak połączyć je w całość i wykorzystać w praktyce? Dobra wiadomość jest taka, że w kursie stworzymy aż 5 praktycznych projektów, wykorzystujących zdobytą wcześniej wiedzę. Najpierw napiszemy program losujący Dużego Lotka, następnie dynamiczny pasek postępu przeczytania artykułu, dymek pojawiający się nad elementem po najechaniu na niego myszą, wygenerujemy tabelkę w użytkownikami na podstawie danych JSON, a na koniec tworzymy prosty odtwarzacz wideo, z możliwością pauzowania i przewijania filmu.
Kurs ten jest dla wszystkich osób, które znają już podstawy HTML i CSS i chciałyby przejść poziom wyżej i dodać do swoich stron dynamiczności. Żadna wcześniejsza wiedza z zakresu JavaScript nie jest wymagana, ale zalecana jest podstawowa wiedza z zakresu samego programowania (czym są zmienne, pętle, funkcje itd.). Materiał ten będzie również świetnym odświeżeniem i usystematyzowaniem wiedzy dla osób, które już z tym językiem miały do czynienia. Po przerobieniu tego kursu będziesz gotowy, by poznawać język JavaScript dalej i zacząć korzystać z nowoczesnych frameworków.
W poprzedniej lekcji pokazałem Ci jak
ustawić za pomocą set Timeout wywołanie jakiejś funkcji po określonym czasie. I tam
to wywołanie działo się wyłącznie jeden raz.
Czyli jeżeli powiedzieliśmy, że po trzech sekundach funkcja ma się wykonać, to ona
się wykonała po trzech sekundach i to wszystko.
Natomiast mamy również drugą funkcję, która nazywa się setInterval
i jej możemy powiedzieć, że chcemy naszą
funkcję wywoływać co określony czas, czyli np.
co sekundę albo co 3 sekundy, ale w
zasadzie w nieskończoność, chyba, że ją anulujemy w odpowiedni sposób
co będę chciał Ci też za chwilę pokazać.
Na początek zrobimy sobie coś takiego, że ustawię zmienną counter na wartość 5 i
następnie będę chciał stworzyć taką funkcję, która będzie zmieniać tę wartość
i zrobimy po prostu takie odliczanie. Więc stworzymy sobie
funkcję wewnątrz setInterval bo setInterval to jest właśnie ta funkcja
wbudowana, która będzie dostępna na platformach wykonujących język JavaScript,
w poprzedniej lekcji było to set Timeout teraz setInterval i tutaj też przekazujemy
funkcję, więc ją stworzę w taki sposób po prostu liniowy.
I ta funkcja będzie wykonywana co określony czas.
Chciałbym ją wykonywać co 1000 milisekund, czyli co sekundę.
I co tutaj będziemy chcieli zrobić?
Będę chciał wyświetlić console.log counter
minus minus. To sprawi, że zostanie na początku tutaj wyświetlone.
5 wartość zostanie zmniejszona do 4 itd.
Zobaczmy co na stronie się wydarzy.
Widzimy tutaj 5 4 3 2 1 0 no i co ważne to będzie w nieskończoność
tutaj szło, dlatego, że nigdzie tego counter nie zatrzymujemy.
I podobnie jak w poprzedniej lekcji pokazałem Ci metodę clearTimeout
podobnie mamy metodę clearInterval. Więc
jeżeli sobie zapiszemy odwołanie do tego interwału jakiejś stałej np.
interval, to teraz wewnątrz tej funkcji możemy sobie zrobić takiego if.
Czyli możemy tutaj powiedzieć jeżeli counter jest mniejszy od zera
to chcemy zrobić clearInterval to jest właśnie ta funkcja
wbudowana i przekazujemy jej referencję do tego interwału.
W przeciwnym wypadku będziemy chcieli wyświetlić counter.
Zobaczmy jak to będzie wyglądać.
Odświeżyła się strona, mamy 5
4 3 2 1 0 -1 ok.
Czyli powinniśmy tutaj jeszcze to zamienić.
To jest tylko kwestia tego warunku.
Jeżeli zrobimy w ten sposób, to już powinno być wszystko w porządku.
Teraz powinniśmy obliczyć do zera i zakończyć.
Dokładnie tak się stało.
Jak zatem widzisz, za pomocą setInterval
możesz określić co jaki czas ma się wykonywać Twoja funkcja.
Natomiast dobrą praktyką wśród
programistów JavaScript jest w zasadzie nieużywanie setInterval
jeżeli nie musimy
a korzystanie z setTimeout w taki rekurencyjny sposób
co będę chciał Ci teraz pokazać i za moment omówię dlaczego tak właśnie jest.
Czyli zróbmy sobie coś takiego, że stworzę
funkcję, którą nazwę tick jak tyknięcie i będziemy chcieli ją wykonywać co sekundę.
W środku będziemy robić console.log
counter minus minus, ale to co mamy u góry wykomentuje żeby ten kod się nie uruchamiał.
Czyli będę chciał wyświetlić counter i zmniejszyć jego wartość.
Natomiast ja tej funkcji nigdzie jeszcze nie wywołałem.
Musimy ją sobie wywołać.
Ale jak dobrze wiesz ona się wykona tylko raz, a nie będzie wykonywana co sekundę.
Więc co my tutaj możemy zrobić?
Możemy wewnątrz takiej funkcji powiedzieć,
że jeżeli counter jest większy lub równy 0, to chcemy raz jeszcze wywołać tę
funkcję, ale z użyciem setTimeout. Czyli setTimeout(tick, 1000).
I już tłumaczę o co chodzi.
Teraz tę funkcję wywołujemy, więc wejdźmy
sobie do tej funkcji, ona nam wyświetli 5 i zmniejszy wartość do 4.
Sprawdzimy czy 4 jest większe lub równe 0. Zgadza się.
Więc ustaw Timeout na tę samą funkcję za
sekundę, czyli za sekundę wpadamy znowu do tej samej funkcji,
bo ten Timeout ustawia nam wykonanie
funkcji tylko raz, więc za sekundę ona się jednorazowo wywoła i sprawdzimy,
mamy tutaj czwórkę, więc czwórkę wyświetlimy, zmniejszymy, znowu sprawdzimy
czy 3 jest większe od 0, większe lub równe,
znowu ustawimy Timeout. I za którymś razem jak ta funkcja się wywoła, to ten warunek
nie będzie już prawdziwy, a więc Timeout nie ustawi się raz jeszcze.
Więc w ten sposób zrobiliśmy coś, co działa tak samo jak setInterval,
ale jest jedna istotna różnica, o której powiem za moment,
najpierw jednak sobie to przetestujmy. Od razu po odświeżeniu strony widać, że wszystko
działa i tak naprawdę wykorzystaliśmy do tego setTimeout, a nie setInterval.
No i na koniec powiem Ci dlaczego to jest
polecany sposób, żeby korzystać z czegoś takiego, a nie z setInterval.
W zasadzie jeżeli te interwały będziesz
miał takie sekundowe to nie ma to większego znaczenia.
Natomiast czasami ustawiało się czy
ustawia się takie bardzo drobne Timeout jak na przykład 50 milisekund,
szczególnie dawniej to było bardzo
popularne, aby na stronie sprawdzić czy coś już się wczytało,
kiedy nie mieliśmy jakichś innych metod,
to np. co 50 milisekund wyszukiwaliśmy jakiegoś elementu na stronie itd.
I teraz co się okazuje?
Jeżeli ustawimy Interval,
przyjmijmy tutaj tą sekundę, ale to nie ma znaczenia
to będzie ta funkcja uruchamiana zawsze co sekundę.
I gdyby w tej funkcji był jakiś kod, który wymaga większego czasu, żeby po prostu
był wykonany większego niż sekundę, to raczej trudno sobie wyobrazić.
Musielibyśmy tutaj mieć naprawdę jakieś bardzo ciężkie obliczenia.
Nie wiem jak ta funkcja musiałaby
wyglądać, ale jeżeli tutaj będzie jakiś bardzo drobny czas, to jest możliwe, że
nie zdąży się jeszcze ta funkcja wykonać, a ten Interval znowu po tym czasie
upycha nam, można powiedzieć kolejną taką funkcję do wywołania i kolejną i kolejną.
Natomiast w przypadku setTimeout wygląda
to inaczej, bo my tutaj robimy funkcję tick.
Tutaj jest kod, który ma się wykonać.
Załóżmy, że tu byłoby więcej kodu, jakieś ciężkie obliczenia.
Więc dopiero jak ten kod się wykona,
załóżmy, że my chcieliśmy to wykonywać co 50 milisekund, ale że ten kod się wykonywał
100 milisekund, czyli po prostu wykonywał się dłużej niż ten interwał, który
chcieliśmy ustawić, to nic tutaj się złego nie stanie, dlatego, że dopiero jak ten
kod się wykona dojdziemy do momentu, gdzie jeszcze raz ustawiamy ten Timeout.
Czyli można powiedzieć, że to kolejne
tyknięcie zawsze będzie po tym jak dany kod już się wykonał.
Czyli może to mieć znaczenie w przypadku bardzo tutaj drobnych czasów.
Gdybyśmy ustawili np.
50 milisekund i chcieli to wykonywać co 50 milisekund.
Lepiej wtedy korzystać z setTimeout.
Oczywiście nie mamy gwarancji, że co 50
milisekund wykona się nasz kod, bo jeżeli obliczenia w takiej funkcji zajmą 70
milisekund, czy 100 milisekund oczywiście jest to możliwe, to ten kod będzie
wykonywany rzadziej, ale będzie to oczywiście bardziej wydajne, natomiast w
tym przypadku on byłby upychany na kolejkę do wykonania co te 50 milisekund
co wcale nie oznacza, że byłby równocześnie wykonywany.
Mieli byśmy po prostu wiele funkcji, które zapychają nam tzw.
stos i byłyby one po kolei wykonywane.
Jak zatem widać, wydaje się, że taka
subtelna różnica, ale w niektórych sytuacjach może mieć znaczenie.
Ja z tego powodu przywykłem do korzystania po prostu z setTimeout
kiedy chcę skorzystać z setInterval. W odpowiedni sposób, tworzę sobie taką
funkcję z jakimś warunkiem i wykonuję w niej setTimeout.
Więc poeksperymentuj sobie z tym i zapamiętaj jaka tutaj jest różnica.
Zapamiętaj też, że to nie oznacza, że nie powinieneś korzystać z setInterval.
Jeżeli ustawiasz interwały takie jak np.
sekundę, nie ma z tym żadnego problemu.