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.
Pokazałem Ci w jaki sposób możemy pobierać
dane z użyciem funkcji fetch, ale co ważne takie dane możemy też wysyłać.
Czyli na przykład może mieć formularz, w którym ktoś uzupełni dane i za pomocą
Ajax bez przeładowywania witryny wyślemy je na serwer.
Natomiast oczywiście to jest bardzo istotne, że pobierać dane możemy wszędzie
tam, gdzie serwer nam potrafi coś wyświetlić tak jak tutaj,
natomiast żeby dane wysłać pod jakiś adres
to serwer musi być w ten sposób przygotowany, żeby np.
metodą POST te dane na odpowiednim adresie przyjmował.
Czyli to nie jest tak, że gdziekolwiek możesz sobie cokolwiek wysłać. Ale ta
strona, jsonplaceholder, z której korzystaliśmy pod takim adresem, czyli
identycznym jak do pobierania, pozwala nam przesyłać dane
gdybyśmy chcieli jakby coś wstawić do tej bazy danych. To jest tylko tymczasowe, to
się nigdzie nie zapisuje, ale służy nam do testowania.
Dlatego będziemy mogli wykorzystać właśnie
taki endpoint, czyli adres. I metodą POST zazwyczaj się wysyła dane.
I będę chciał Ci pokazać jak to zrobić.
Więc skopiujemy sobie ten adres i znowu po
kliknięciu w ten przycisk będziemy chcieli metodą fetch,
zróbmy sobie najpierw tutaj funkcję, czyli po kliknięciu w przycisk metodą fetch
będziemy chcieli do serwera jakieś dane wysłać.
Więc napiszemy znowu fetch, podamy adres pod jaki wysyłamy dane
i teraz jak powiedzieć, że nie chcemy
danych pobrać, a więc nie wysyłamy zapytania HTTP o typie GET, ale będzie to
typ POST musimy podać tutaj jako drugi parametr do tej funkcji
taki obiekt konfiguracyjny.
Przekażę go w ten sposób rozwinę, żeby było bardziej czytelne
i tutaj podajemy coś takiego jak method i string POST.
To informuje tę funkcję, że wysyłamy to takim właśnie zapytaniem POST.
Następnie musimy przekazać body, czyli to co chcemy wysłać właśnie na ten
serwer. I my chcemy tam wysłać JSON, ale skąd go weźmiemy?
Moglibyśmy oczywiście utworzyć formularz,
pokazywałem Ci w tym kursie jak możemy z
użyciem JavaScriptu odczytywać pola formularza, ale żeby tego przykładu nie
komplikować, to po prostu ręcznie utworzę tutaj obiekt,
który nazwę post jak wpis i przypiszemy mu tutaj title Nowy wpis i następnie body.
Bo to są te dane, których oczekuje ten
serwer title i body. Więc to jest istotne, żeby to po prostu tam przekazać.
Aczkolwiek do innego serwera, gdybyś wysyłał np.
formularz kontaktowy będziesz zawsze wysyłał takie dane jakich serwer oczekuje,
albo Ty będziesz go tworzył, albo back end developer powie Ci co tam masz wysłać.
Więc tutaj wpiszemy treść nowego wpisu.
I teraz wyobraź sobie, że te dane pobrał byś po prostu z formularza.
Pokazywałem Ci jak z użyciem właściwości value na danym polu pobrać to co ktoś
wpisał, no i na podstawie tego co byś pobrał utworzył byś dokładnie taki obiekt.
I teraz ten obiekt chcemy wysłać, ale nie
możemy go tutaj po prostu tak podstawić dlatego, że musimy do serwera wysłać
JSON a to nie jest JSON tylko obiekt.
Pokazywałem Ci jak możemy obiekty zamienić na JSON, czyli tak naprawdę na string.
Robimy to w języku JavaScript
za pomocą JSON.stringify i przekazujemy tam obiekt.
Cały ten zapis zwróci nam string, który
będzie reprezentował te dane i funkcja fetch
właśnie ten string w takiej właściwości body wyśle do serwera.
I jest jeszcze jedna rzecz, którą możemy
zrobić, ale nie musimy, bo w tym przypadku to zadziała.
Ale jeżeli wysyłamy JSON, to dobrze jest
ustawić nagłówek zapytania, który informuje serwer o jakim typie danych
te dane tam wysyłamy. I możemy to dodać za pomocą takiego specjalnego tutaj klucza w tym
obiekcie, który nazywa się headers i dodamy nagłówek, który nazywa się Content-Type.
Czyli muszę go podać w cudzysłowie tutaj,
żeby z tego minusa móc skorzystać i jest to application/json.
Jeżeli to są dla Ciebie nowe rzeczy, to
one nie wynikają z tego, że nie rozumiesz jak działa JavaScript, tylko z tego, że
musisz doszkolić się w samym protokole HTTP.
Najlepiej jest to zrobić zerkając sobie tutaj do panelu Network i patrząc jak
wyglądają różne zapytania, ale oczywiście to też przyjdzie z czasem.
Nie musisz wszystkiego wiedzieć od razu.
Ja chcę Ci pokazać, że nagłówki po prostu też możemy ustawiać.
OK, no i jeżeli zrobimy coś takiego, to ta funkcja wyśle nam to do serwera,
ale zazwyczaj jest tak, że serwer wtedy
kiedy przyjmie takie dane, coś nam zwraca np.
identyfikator nowo utworzonego wpisu itd.
Więc będziemy oczywiście też chcieli sobie
przechwycić odpowiedź z serwera i zrobimy to w tym bloku then.
Zobaczymy co tam się znajdzie.
Ja wiem, że ten serwer zwraca w response
również JSON, więc będziemy go chcieli sparsować
i w lekcji poprzedniej wstawiałem tutaj funkcję taką zwykłą, ale dla skrótu możemy
tutaj wstawić funkcję strzałkową, która po prostu zwróci nam res.json
To działa identycznie, ale jak widzisz to jest dużo krótszy zapis.
W razie czego wróć do lekcji o funkcjach strzałkowych,
dlaczego to tak wygląda.
Więc albo zwykłe function i całą funkcję tu podstawiasz taką klasyczną albo funkcję
strzałkową. Czyli to co serwer nam odeśle zostanie sparsowane na JSON, bo serwer
odsyła nam po prostu tekst i następnie w kolejnym then już ten JSON
tutaj otrzymamy. Nazwę sobie tak stałą json, ale możesz ją
nazwać jak chcesz i będę chciał zrobić w console.log
po prostu tenże JSON.
A więc zobaczmy, wyślijmy ten post do serwera i zobaczymy co serwer nam odpowie.
Jestem w panelu Network, klikam wyślij dane.
Widzimy, że zapytanie do serwera wyszło i następnie serwer
coś nam odesłał. Tutaj możemy to zobaczyć w Response,
odesłał nam coś takiego, to co tam wysłaliśmy, czyli title
Nowy wpis, treść nowego wpisu i nadał naszemu wpisowi nowe id.
Jak wspomniałem jest to tylko taki serwer
testowy, ale pozwala nam wysłać właśnie takie zapytanie o typie POST
co widzimy w tym miejscu pod ten adres, a
na dole możemy zobaczyć co my do tego serwera tak naprawdę wysłaliśmy.
Jest to tutaj fajnie pokazane jako request payload.
W prawdziwym życiu zrobiłbyś tutaj jakiś formularz, do którego można coś wpisać, no i
można by było dodatkowo zrobić tak, że jak ktoś kliknie w ten przycisk to ustawimy mu
atrybut disabled albo za pomocą setAttribute, albo takim skrótem disabled
na true, ten przycisk wtedy zostanie jakby wyłączony,
wyśle się to do serwera i dopiero jak
otrzymamy odpowiedź czyli po jakimś czasie, bo to wszystko działa
asynchronicznie będziemy mogli powiedzieć button.textContent np.
Wysłano i moglibyśmy tutaj ten przycisk
odblokować, czyli napisać disabled false, ale ja nie chcę go odblokowywać,
chcę żeby on był zablokowany.
Chodzi o to, że jak ktoś kliknie dwa razy szybko to byśmy wysłali dwa zapytania.
Ja chcę po kliknięciu w przycisk go
zablokować, więc kolejne kliknięcie nie wywoła już tej funkcji.
Wysłać zapytanie do serwera i jak
otrzymamy odpowiedź to zmienić jego tekst na wysłano.
Wtedy moglibyśmy go również odblokować
ustawiając to disabled gdzieś w tym miejscu na false i jeszcze raz wysłać
dane, ale ja nie chcę pozwalać na ich ponowne wysyłanie.
Zobaczmy jak to zadziała.
Otrzymaliśmy komunikat z powrotem i mamy tutaj wysłano i
przycisku już nie da się kliknąć, bo go nie odblokowałem.
Asynchroniczność, o której wspomniałem
przejawia się w tym, że ten kod nie wykonuje się tak do końca z góry na dół.
Czyli jak byśmy tutaj zrobili np.
console.log Przed wysłaniem
I to się nie tyczy tylko tego zapytania
POST, ale to co było w lekcji poprzedniej
również, zawsze jak używasz fetch wyświetlimy Przed wysłaniem.
Tutaj byśmy powiedzieli
Po wysłaniu i myślimy, że to się wykona później niż to miejsce,
ale tak nie jest. Tutaj napiszemy sobie console.log
Właśnie wysłałem.
Zobacz, no i prześledźmy jak te console.logi po prostu będą wyglądać.
A więc zobaczymy przed wysłaniem, po wysłaniu i dopiero Właśnie wysłałem.
Czyli asynchroniczność takich zapytań polega na tym, że wykonuje się ten kod.
Tutaj ustawiamy to zapytanie, ono jest wysyłane, ale niczego nam nie blokuje,
dalszy kod jest wykonywany aż wykona się cały nasz skrypt.
I kiedy można powiedzieć, że otrzymamy odpowiedź z serwera to wracamy do tej
funkcji, którą tutaj przekazaliśmy i dopiero wtedy ona się wykonuje.
Więc mam nadzieję, że to jest jasne, że
chociaż jakby z góry na dół ten kod się wykonuje, to nie czekamy z wykonaniem
kolejnej linijki do czasu aż wszystko się z serwera pobierze, tylko po prostu
kontynuujemy wykonywanie kodu i nie blokujemy niczego na stronie.