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.
Kiedy wiesz już czym jest JSON, bo powidzieliśmy w lekcji poprzedniej, że jest
to po prostu taki tekstowy format wymiany danych, który można sparsować np.
na obiekty JavaScript, to w tej lekcji powiemy sobie czym jest Ajax i jak wygląda.
A więc Ajax to jest nic innego jak takie potoczne określenie na sposób wysyłania
zapytań przez przeglądarkę JavaScript z poziomu kodu JavaScript.
Czyli innymi słowy jeżeli tą stronę odświeżę to przeglądarka wysłała do tego
serwera lokalnego zapytanie po taką stronę i ją pobrała.
Natomiast w momencie życia tej strony, czyli można powiedzieć, że ona teraz jest
czytana i sobie żyje, nic się na niej nie dzieje,
wiesz, że możemy wykonywać kod JavaScript na przykład klikając na jakiś przycisk,
możemy wykonać naszą funkcję. I Ajax pozwala nam wysłać zapytanie do serwera po
jakieś dodatkowe dane, otrzymać te dane w formie np.
tekstu i ten tekst wstawić na stronę bez przeładowywania strony.
No i jak możemy zrealizować AJAX w nowoczesnych przeglądarkach?
Najpierw powiem Ci jak mniej więcej robiło się to do tej pory.
Otóż nadal można tak robić i sporo różnych
bibliotek z tego korzysta, że tworzyliśmy taki specjalny obiekt.
Nazwalibyśmy zmienną xhr i pisaliśmy new XMLHttpRequest. To był taki specjalny
obiekt tutaj zwrócony, na którym się ustawiało różne rzeczy
wpisując np.
open podawaliśmy, że chcemy wysłać zapytanie metodą GET,
podawaliśmy tutaj adres, potem mogliśmy dodać jeszcze jakieś dane
na przykład w przypadku GET wysyłaliśmy
tylko coś pod adres, ale w przypadku metody np.
post mogliśmy jakieś dane pobrać itd.
Przypisywaliśmy do tego obiektu
odpowiednie zdarzenia, że jak się to już pobierze, to coś wykonaj itd.
Nadal można to robić, ale ja nie chcę Ci
tego przedstawiać, bo mamy lepszą, nowszą funkcję, która jest dużo prostsza w
użyciu, a pozwala zrealizować dokładnie to samo.
I ta funkcja w przeglądarkach internetowych nazywa się fetch.
Co ważne, ta funkcja nie jest częścią
samego języka JavaScript, ale tylko tej platformy webowej.
Czyli można powiedzieć, że środowiska przeglądarek internetowych.
I teraz co my będziemy chcieli zrobić?
Otóż będziemy sobie chcieli pobrać dane JSON z takiej strony,
zobacz, mamy taką stronę jsonplaceholder.typicode/posts
Tutaj można sobie takie dane
pobierać i po prostu z nimi pracować, więc to wykorzystamy.
I tak jak Ci pokazałem w lekcji poprzedniej, JSON to jest nic innego jak po
prostu ciąg znaków. Czyli to jest zwykły tekst, który my otrzymamy z tego serwera,
natomiast widzimy od razu, że w przypadku
JavaScriptu jak to sparsujemy to będziemy mieli tablicę, a w tej tablicy
wiele obiektów, które reprezentują posty, czyli jakieś wpisy.
Jak sobie to zamienimy na obiekty JavaScript to będziemy mieli tablicę z
obiektami i będziemy mogli do każdego z nich się odwołać np.
wstawiając go na stronę.
Więc to jest ważne, że chcemy wysłać sobie zapytanie pod taki adres.
Zatem kopiuję ten adres i po kliknięciu na ten przycisk coś będziemy chcieli zrobić.
A więc przypiszmy mu zdarzenie poprzez addEventListener click,
to jest funkcja, którą chcę wywołać, kiedy ktoś kliknie.
I w tej funkcji zrealizujemy sobie właśnie pobieranie tych danych.
A więc funkcja nazywa się fetch
i jak wspomniałem, jest globalnie dostępna
i ta funkcja przyjmuje tutaj adres pod jaki chcemy wysłać zapytanie HTTP.
Wstawimy sobie tutaj ten adres i następnie ta funkcja zwraca tzw.
promise.
A na tych promisach pracuje się tak, że można na nich skorzystać z metody then,
czyli powiedzieć kiedy to się pobierze, wykonaj moją funkcję.
I tutaj możemy przekazać funkcję,
która otrzyma automatycznie taki parametr jak res, czyli response.
Oczywiście możesz go nazwać jak chcesz, bo to Ty tworzysz tą funkcję.
Mam nadzieję, że na tym etapie jest to już jasne, no i moglibyśmy sobie zrobić console.log
tego response, żeby zobaczyć co tam się znajduje.
Ja to złamię również na nową linię,
dlatego, że taki zapis w języku JavaScript jest jak najbardziej poprawny.
Będzie działał tak samo. Więc po
kliknięciu na przycisk wyśle się jakieś zapytanie i żeby to zobaczyć przejdziemy
sobie tutaj do panelu Network i to zapytanie po prostu zobaczymy.
Mamy tutaj zaznaczone All, możemy też zaznaczyć samo XHR,
wtedy będziemy widzieć tylko te zapytania AJAX-owe.
Niemniej jednak jak to zaznaczysz
a będziesz szukał potem jakichś innych zapytań
pamiętaj, żeby wrócić do All.
Teraz klikam Pobierz dane i zobacz.
Widzimy to zapytanie.
Ono rzeczywiście się wysłało.
Jeżeli sobie klikniemy to zobaczymy wszystkie jego szczegóły. Pod jaki adres
było wysłane, jaki status Code otrzymaliśmy itd.
Jakie my wysłaliśmy nagłówki.
To jest temat związany stricte z
protokołem HTTP, który może nie być dla Ciebie jeszcze zbyt dobrze znany.
Niemniej jednak wiedz, że wysyłamy
zapytania dodając jakieś Response Headers, czyli takie dodatkowe dane do tego zapytania,
przeglądarka je wysyła, serwer na ich podstawie może różne decyzje podejmować,
niemniej jednak najważniejsze jest tutaj, że otrzymaliśmy spowrotem coś takiego.
Przynajmniej tak to wygląda tutaj.
Ale jak sobie zerkniemy do konsoli co się
znalazło pod tym obiektem response to wygląda to tak.
No i teraz jak odczytać te dane, które rzeczywiście z takiego adresu są zwracane?
Mamy ten obiekt response i teraz z niego
musimy sobie to jakoś wyciągnąć. I robi się to w ten sposób, że w tej funkcji fetch
ten obiekt response tutaj podstawiany ma kilka metod np.
metodę text.
I jeżeli zrobimy return text
to text zwraca taką specjalną promise, więc nie możemy sobie od razu tutaj np.
przypisać do zmiennej powiedzmy text i sobie to jakoś odczytać
tylko musimy to zwrócić z tej funkcji i to sprawi, że możemy dodać tutaj kolejny blok
then i tutaj podać kolejną funkcję, która już otrzyma ten konkretny text.
Działa to w taki sposób asynchroniczny, że po prostu jeżeli jest to tutaj zwracane
jakiś czas będzie to powiedzmy przetwarzane na text.
Oczywiście to będzie bardzo szybko, ale
działa to w sposób asynchroniczny i z tego powodu musimy podać kolejny blok then,
a nie wystarczy żebyśmy sobie to zapisali do stałej.
Tutaj już do tej funkcji pod text zostanie to właśnie podstawione w odpowiedni sposób
i możemy zrobić console.log tego właśnie tekstu.
Więc zobaczmy.
Pobierz dane i w konsoli wyświetlił się cały ten tekst pobrany z serwera.
Ten tekst jest to JSON, ale jeżeli chcielibyśmy go zamienić na obiekty
JavaScript na taką tablicę, to musimy na tym tekście wykonać sobie to,
co Ci pokazałem w lekcji poprzedniej, czyli JSON.parse. A więc sparsować cały
ten tekst i to nam już zwróci prawdziwą tablicę z obiektami.
Zobaczmy.
Jak widzisz, tak to jest tutaj wyświetlane.
Mamy prawdziwą tablicę pod indeksem pierwszym, czyli zero.
Na samym początku mamy jakiś obiekt 1 i tak dalej.
Niemniej jednak jeżeli z serwera pobieramy
JSON, bo możemy pobierać też inne rzeczy,
to jeżeli pobieramy JSON to nie musimy
tutaj zwracać tekst, tylko jest na tym obiekcie response.
Specjalna metoda, która nazywa się JSON i wtedy pod to tutaj text zostanie już
podstawione dokładnie to samo, co moglibyśmy zrobić z użyciem JSON.parse.
Więc jeżeli to tak podstawie, to już nie musimy tego automatycznie parsować.
Zostało to za nas sparsowane i wtedy nazwa tego parametru text nie do końca ma sens.
Pobieramy posty, więc nazwijmy to po prostu posts.
OK, zobaczmy jeszcze raz.
Działa to dokładnie tak samo.
Kiedy natomiast korzystałbyś z tej metody text?
Zawsze wtedy, kiedy pobierasz jakiś tekst z serwera.
Może to być jakiś kod HTML, który z
użyciem inner html wstrzykniesz na stronę, albo np.
zobacz, gdybyśmy skopiowali sobie cały ten adres,
swoją drogą możemy kliknąć prawym przyciskiem, podejrzeć źródło strony,
ten adres zwraca taki tekst html. Więc
pytanie czy Ajaxem można by było taki tekst pobrać?
Jak najbardziej. Gdybyśmy tutaj podstawili coś takiego.
Tylko wtedy byśmy tego nie parsowali na JSON, bo to po prostu nie zadziała, a
zwrócilibyśmy stąd text, to zostanie podstawione pod posts,
może to nazwiemy jeszcze na chwilę text.
To co by się pobrało. Zobaczmy.
Klikam Pobierz dane i w konsoli widzimy cały kod HTML tej strony.
A to nam pokazuje, że z użyciem AJAX
możemy wysyłać dowolne zapytania HTTP i następnie to co serwer normalnie by
zwrócił to zwróci nam po prostu w formie takiego tekstu. Czyli jak przeglądarka przy
odświeżeniu tej strony wysyła zapytanie to otrzymuje taki kod HTML,
więc jak my wyślemy takie zapytanie Ajaxem też otrzymamy taki kod HTML,
natomiast są pewne restrykcje, że nie do
wszystkich stron możesz sobie wysyłać takie zapytania.
Te serwery do których chcesz wysyłać
zapytania muszą pozwalać na takie zapytania AJAX.
Ale o tym teraz nie będziemy mówić.
Wrócimy sobie do takiego formatu.
I w zasadzie jeżeli chodzi o ten fetch to tak to wygląda.
Ale możemy jeszcze obsłużyć jeden wyjątek,
to znaczy kiedy będzie błąd.
Bo jeżeli ten adres jest poprawny, to
otrzymamy poprawne dane, ale jeżeli on byłby niepoprawny np.
podałbym tutaj coś takiego, zobacz, spróbujemy wysłać zapytanie i
otrzymamy błąd. Jeżeli chcielibyśmy go w kodzie obsłużyć, żeby na przykład
wyświetlić komuś komunikat na stronie, że wystąpił błąd, to w takich promise możemy
podać blok catch i tutaj przekazać funkcję, która się wywoła kiedy wystąpi błąd.
I możemy tutaj napisać np.
Wystąpił błąd.
OK, zobaczmy. Pobieramy
i jak widzisz tutaj mamy
teraz Wystąpił błąd, więc ładnie to obsłużyliśmy,
natomiast jeżeli tego błędu nie
będzie, to ten blok catch z tą funkcją w ogóle się nie wykona.
Mam zatem nadzieję, że na szybko zrozumiałeś jak działa JSON.
Funkcją fetch możemy sobie pobrać z serwera
dowolne dane i następnie, jeżeli to są dane JSON, możemy je zwrócić w ten
sposób, a w kolejnej funkcji zrobić już z tym sparsowanym JSON co chcemy.
Jeżeli natomiast będziesz pobierał inne dane np.
czysto tekstowe, nie będziesz tego parsował na JSON.
Tutaj zwrócisz to metodą text i w kolejnym
bloku then również będziesz mógł z tym zrobić dowolną rzecz, traktując to jako string
JavaScript.