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 tej lekcji pokażę Ci trzy sposoby na to, jak
możemy przypisywać zdarzenia
do elementów z drzewa DOM. Zdarzenia mogą być
różne,
niemniej jednak w tej lekcji skupimy się na
zdarzeniu click.
I mam trzy przyciski, po kliknięciu
na każdy z nich nic się nie dzieje
ale właśnie cała magia JavaScript w przeglądarce polega
na tym, że możemy w trakcie wczytywania się naszego
skryptu zarejestrować zdarzenie.
To znaczy, że jeżeli ktoś kliknie np. w ten przycisk
to chcemy wykonać jakąś naszą konkretną funkcję.
I teraz pokażę Ci pierwszy ze sposobów na przypisywanie zdarzeń.
Mamy te trzy
przyciski tutaj mają one takie identyfikatory i dwa z nich sobie pobrałem
bo wykorzystamy tutaj.
Pierwszy wykorzystamy w kodzie
HTML. I mam jeszcze funkcję sayHello, która jest tutaj wstawiona bezpośrednio do
tego pliku, a co za tym idzie ona jest globalna i to jest
bardzo ważne, żeby można było się
do niej odwołać gdziekolwiek.
I ona nam robi taki alert
hej. Czyli alert jest to wbudowana w
przeglądarkach funkcja, która nam wyświetla takie oto okienko.
I teraz pierwszym ze sposobów
na przypisywanie zdarzeń
jest przypisanie ich w sposób liniowy
i robi się to w ten sposób, że napiszemy
tutaj onclick,
czyli jeżeli nazwa zdarzenia to
jest click to dodajemy przedrostek
on i mówimy onclick
i tutaj podajemy w tym atrybucie kod JavaScript, który chcemy wykonać.
Więc jeżeli
mamy globalnie dostępną funkcję sayHello, to tutaj
muszę wpisać coś
takiego, czyli wywołanie
tej funkcji. I zobacz co teraz się stanie
kiedy kliknę w ten pierwszy przycisk, wywoła się nasza funkcja.
I na moment się zatrzymamy bo chcę Ci powiedzieć,
że to jest sposób, z którego raczej nie powinieneś korzystać, jeżeli nie musisz.
Ja z niego korzystam niezwykle rzadko, w jakiś bardzo specyficznych przypadkach.
Natomiast mogłeś się spotkać jeżeli wcześniej już
widziałeś frameworki takie jak React czy np.
View, że w podobny sposób przypisuje się tam zdarzenia.
Niemniej jednak niech Cię to nie zmyli
dlatego, że w przypadku
takiego frameworka jak na przykład React tam w template
czyli w szablonie przypisujemy co prawda w ten
sposób zdarzenia, ale cały
ten szablon jeszcze w
skomplikowanym procesie jest kompilowany i tak naprawdę pod spodem
można powiedzieć, że te zdarzenia są
przypisywane w inny sposób za pomocą
metody, którą za chwilę będę chciał Ci pokazać. A więc to, że w jakiś frameworkach
w podobny sposób wprost do elementu przypisuje się zdarzenia,
to nie oznacza, że one finalnie są właśnie tak przypisywane.
Kolejnym ze sposobów,
który będę chciał Ci pokazać jest to sposób za pomocą właściwości.
Odwołamy się do tego buttona drugiego,
pobrałem sobie go już tutaj i będzie to wyglądało następująco btn 2,
mamy taką właściwość jak onclick.
Jeżeli mielibyśmy inne
zdarzenia np.
DoubleClick to zapisali byśmy w ten sposób.
Czyli też dodajemy przedrostek
on, onclick i przypisujemy tutaj funkcję, którą chcemy żeby się wywołała.
Więc tak to będzie wyglądać.
I teraz jeżeli ktoś kliknie na ten przycisk
to co ja będę chciał zrobić?
Może wywołać sayHello. Czyli tę samą funkcję, która jest tutaj.
Zobaczymy.
Po kliknięciu na ten przycisk działa to dokładnie tak samo.
Natomiast co ciekawe, wcale nie musimy
tutaj wywoływać tej funkcji wewnątrz jakiejś nowej funkcji.
Wystarczy, że ją tutaj przekażemy
w ten sposób. Zobacz, to zadziała dokładnie tak samo klikam i jest ok.
Natomiast nie wywołujemy tej funkcji, bo gdybyśmy zrobili tak, to by oznaczało,
że
pod onclick chcemy przypisać to co ta funkcja zwraca, bo jak ją wywołuje to tu
jest podstawione to co ona zwraca. Ona nic nie
zwraca, czyli zostało by tu podstawione undefined,
no i to by nie działało. Dlatego tu trzeba przekazać
referencję do funkcji
albo ją wpisać tutaj ręcznie jakąś całą inną funkcję albo przekazać w ten sposób.
Natomiast teraz Ci powiem, dlaczego
taki sposób przypisywania zdarzeń nie
jest idealny.
Otóż dlatego, że możemy do takiego
przycisku przypisać wyłącznie jedno zdarzenie kliknięcia.
Gdybym ponownie powiedział btn2 onclick i przypisał tutaj funkcję
już tym razem w sposób ręczny,
ale to nie ma znaczenia
i ona zamiast alert Hej będzie robiła alert
Witaj, to co się stanie kiedy kliknę w ten przycisk?
Zobacz, zobaczymy Witaj.
Czyli można powiedzieć, że to kolejne przypisanie
nadpisało to, które było wyżej.
A więc taki sposób pozwala na przypisanie
wyłącznie jednej funkcji obsługi takiego zdarzenia.
A więc w zasadzie
nie ma powodu, żeby korzystać z tego
sposobu. I na koniec
pokażę Ci
ostatni sposób, który jest najczęściej wykorzystywany i jest on sposobem
najlepszym.
Zatem odwołamy się do button 3, który też mamy u
góry pobrany
i na każdym elemencie w drzewie DOM nie tylko na przyciskach,
ale do dowolnego div, paragrafu, nagłówka,
do wszystkiego możesz dodać sobie
takie zdarzenie.
Mamy dostępną metodę addEventListener.
Ona wygląda w ten sposób
i przyjmuje trzy parametry.
Przy okazji zauważ, że ja właśnie specjalnie
ten trzeci przycisk zrobiłem jako div a nie button
żeby Ci pokazać, że w div też można kliknąć,
nie ma najmniejszego problemu.
I teraz tutaj podajemy
nazwę zdarzenia jako string, czyli jak wyżej
mieliśmy onclick
tutaj podajemy samo click samą nazwę zdarzenia,
później podajemy funkcję, którą chcemy wykonać
kiedy ktoś kliknie w ten przycisk.
Mogę znowu podstawić tutaj referencję do funkcji sayHello
i też jej nie wywołuje, tylko ją po prostu podstawiam
i ostatni parametr to jest taki parametr czy chcemy
używać tzw. capturingu.
O nim będzie w jednej z kolejnych lekcji.
Tutaj 9 na 10 razy albo nawet częściej będziesz
podstawiał false,
ale można ten parametr również pominąć.
Możemy zrobić tak i to będzie dokładnie
tak samo, więc tylko wtedy, kiedy chcesz dać true będziemy to ustawiać.
O tym jeszcze powiem później.
Czyli teraz jeżeli kliknę na ten trzeci przycisk też się
wykona ta sama funkcja sayHello,
natomiast przewaga tego addEventListener jest taka,
że możemy przypisać więcej zdarzeń,
więcej funkcji obsługi do jednego elementu.
Czyli mogę teraz powiedzieć button 3
addEventListener i na kliknięcie
przypisać jeszcze inną funkcję, np.
sobie ją tutaj wpiszę, tym razem ręcznie,
jest to funkcja anonimowa. Czyli ona zostanie
utworzona i podstawiona w to miejsce i będę chciał zrobić alert
Witaj
i jak kliknę to powinna się wykonać najpierw ta funkcja, bo
pierwsza została zarejestrowana
a potem druga.
Zobaczmy, zobaczyliśmy Hej i następnie Witaj.
Czyli za pomocą addEventListener
można dowolne zdarzenia przypisywać
i można dzięki temu przypisać więcej niż jedną funkcję
obsługi zdarzenia do jednego elementu. Na koniec
pokażę Ci jeszcze jak usuwać takie
zdarzenia. Czasami jest tak, że
chcemy tylko raz wywołać jakąś funkcję i wewnątrz tej funkcji chcielibyśmy np.
usunąć to zdarzenie. Ja to jednak zrobię
po prostu tutaj poniżej, żeby pokazać Ci sposób.
Czyli w przypadku takim jak mieliśmy tutaj przypisaliśmy na
onclick jakąś funkcję, potem to nadpisaliśmy
to żeby usunąć takie zdarzenie wystarczy zrobić
btn 2 onclick i ustawić to na null.
I zauważ, że teraz ten drugi przycisk jak
klikamy nic się już nie dzieje,
natomiast w przypadku addEventListener robimy to inaczej.
btn3 mamy metodę removeEventListener
i jej trzeba przekazać takie same
parametry, czyli
na kliknięcie chcę usunąć i podać funkcję sayHello, czyli której to
dotyczy. Natomiast tutaj niesłychanie
jest ważne to, żeby mieć odwołanie do tej funkcji.
Czyli jak miałem funkcję tu i dodawałem ten Listener, to powiedziałem
na kliknięcie wywołaj funkcję sayHello. A teraz chcę to odbindować
czyli powiedzieć, że już od
teraz nie chcę na kliknięcie wywoływać tej funkcji, to
muszę ją tutaj przekazać. I zobacz.
Jeżeli teraz
kliknę, wywoła się tylko jedna funkcja Witaj.
Natomiast my do tej funkcji nie mamy
dostępu, więc gdybyśmy chcieli to odbindować, to jest
też bardzo ważne,
nie wystarczy zrobić tutaj removeEeventListener klik i podać taką samą funkcję.
To nam nie zadziała z prostego powodu.
Otóż ta funkcja tutaj może i wygląda tak
samo jak ta, ale w JavaScript obiekty a funkcja jest traktowana jak obiekt
są przekazywane przez
referencje, więc to są dwie zupełnie różne funkcje.
Czyli jeżeli podajesz funkcję anonimową, to nie masz możliwości
usunięcia tej funkcji później.
Więc jeżeli chcielibyśmy koniecznie
móc wykonywać tę funkcję, ale na jakimś etapie ją odbindować, to musielibyśmy ją
stąd wyciągnąć, wstawić ją tutaj, nadać jej jakąkolwiek nazwę, np.
fn2 coś takiego i przypisać ją tutaj podstawiając przez
referencję. Wtedy gdybyśmy ją chcieli odbindować, to możemy
wskazać,
którą funkcję chcemy usunąć, robiąc to w taki sposób.
Niemniej jednak ja zostawię to tutaj w takim
charakterze anonimowym.
Zapamiętaj jednak.
Tutaj musimy dodać remove.
Zapamiętaj jednak, że jeżeli chcesz
usunąć taki Listener, musisz mieć uchwyt do funkcji, którą podstawiasz
jako drugi parametr.
Po wykonaniu takiego kodu
cały czas nam zostanie ta jedna funkcja, więc to może usunę.
I jak widzisz funkcja witaj się wykonuje, ale na sayHello już nie.
Czyli wykonała się po prostu ta funkcja.
Podsumowując.
Jeżeli koniecznie będziesz z
jakiegoś powodu musiał i nie znajdziesz innego
sposobu, albo będzie to najwygodniejsze
przypisać zdarzenie np.
kliknięcia w sposób liniowy, to zrób to w ten sposób.
W innych przypadkach unikaj takiego sposobu.
Unikaj też raczej tego sposobu
a korzystaj z addEventListener i removeEventListener to jest to, co sprawdzi się
praktycznie w każdym przypadku.