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 wytłumaczę Ci czym jest zjawisko nazywane bubbling.
Zaczniemy od tego, że do przycisku btn
będę chciał przypisać zdarzenie kliknięcia,
tutaj sobie przechwycimy event,
za moment z niego skorzystamy
i teraz będę chciał powiedzieć kliknąłeś w przycisk.
OK w ten sposób.
I teraz o co chodzi? Klikam sobie,
oczywiście to się pojawia. W bubblingu
chodzi o to, że my przypisaliśmy
zdarzenie kliknięcia do przycisku, ale na każdym z jego rodziców również
zostanie wywołane zdarzenie kliknięcia. Czyli zobacz,
jeżeli my klikamy w ten przycisk i on znajduje się tutaj,
to jeżeli będą przypisane zdarzenia, kliknięcia do tego kontenera też się
wywołają, bo nie musimy kliknąć bezpośrednio w ten kontener
jeżeli klikniemy w przycisk to też kliknęliśmy w kontener.
Jeżeli do section będą przypisane zdarzenia też się wywołają, mimo tego, że
kliknęliśmy w przycisk i podobnie będzie z body.
Żeby to pokazać zrobimy tak, że do body, które mam u góry pobrane przypiszemy
zdarzenie kliknięcia i tym razem zrobimy sobie tutaj Kliknąłeś w body.
OK.
No i zobacz jeżeli sobie klikam gdzieś w body bezpośrednio, chociaż tak naprawdę to
klikam w kontener, ale pokazuje się kliknąć w body.
Zobacz co stanie się jeśli kliknę w
przycisk. Mamy Kliknąłeś w przycisk i Kliknąłeś w body.
Ale zauważ jaka tutaj jest kolejność.
Przypisałem najpierw zdarzenie kliknięcia do body, a potem do przycisku, a mimo tego
najpierw zobaczyliśmy Kliknąłeś w przycisk, a później Kliknąłeś w body.
I właśnie na tym polega bubbling, że jeżeli przypiszemy zdarzenie kliknięcia do
przycisku i klikniemy sobie w ten przycisk,
to wywoła się funkcja, która do niego była przypisana, czyli to jest ta funkcja.
Następnie będzie to bubblowało, mówiąc tak
bardzo potocznie w górę do kolejnego rodzica, czyli do kontenera.
Czy na kontenerze jest jakaś funkcja przypisana?
Nie jest.
Lecimy dalej. Czy jest przypisana na section?
Nie jest. Lecimy wyżej.
Czy na body jest przypisana jakaś funkcja?
Jest, to ją wywołaj.
Czyli innymi słowy kliknięcie w dowolny element sprawia, że jest uruchamiane
również to zdarzenie kliknięcia na wszystkich jego rodzicach
i jeżeli jakaś funkcja była do tego przypisana, to ona zostanie wywołana.
I teraz co my możemy z tym zrobić, jeżeli nie chcielibyśmy, aby klikając w przycisk
wywoływały się również funkcje, które mogą być przypisane do rodziców, np.
do body? Otóż okazuje się, że ten event, który
jest tutaj przekazywany, my w poprzedniej lekcji z niego odczytaliśmy sobie np.
Target czy currentTarget, ale
jest to obiekt, który zawiera różne metody.
Jedną z takich metod jest metoda stopPropagation,
czyli zatrzymaj tę propagację do góry.
Jeżeli coś takiego zrobimy to oznacza wywołaj tę funkcję tutaj zatrzymaj
propagację, czyli już nie leć do góry nie wywołuje tego zdarzenia wyżej.
Zobaczmy w konsoli. Klikam teraz w przycisk i widzimy tylko
kliknąłeś w przycisk a więc body można powiedzieć już o tym, że zostało
kliknięte. Ale jeżeli kliknę gdzieś indziej zobaczymy
Kliknąłeś w body, bo ten kod ze stopPropagation po prostu się w żaden sposób
nie wykona, bo on jest wykonywany tylko jeśli klikniemy przycisk.
Za chwilę jeszcze pokażę Ci praktyczny przykład do czego może się to przydać, ale
na koniec chcę pokazać jeszcze jedną istotną rzecz. Co by się stało w sytuacji,
gdybyśmy do tego przycisku mieli przypisane dwa zdarzenia kliknięcia?
Czyli mamy jedno i mamy drugie,
wyrzucę to stopPropagation i napiszę tutaj Kliknąłeś przycisk ponownie.
Czyli dopiszemy tutaj
ponownie. Zastanówmy się co się dzieje.
Po kliknięciu w przycisk wywoła się najpierw ta funkcja, bo ona była jako
pierwsza zdefiniowana, więc zobaczymy console.log kliknąłeś w przycisk.
No ale skoro kliknęliśmy, a tutaj mówimy, że na kliknięcie chcemy wywołać
jeszcze tę funkcję, to wywoła się również ten console.log.
Zobaczmy.
Jak widzisz Kliknąłeś w przycisk i Kliknąłeś w przycisk ponownie.
Natomiast czasami może się zdarzyć tak, że
chcemy nie tylko zatrzymać tę propagację, która idzie do góry, ale również zatrzymać
wywoływanie się innych funkcji przypisanych do tego samego elementu.
Czyli chciałbym zrobić tak, że jak kliknę w ten przycisk to żeby się wywołała
wyłącznie ta funkcja i żadna inna, która mogła być do tego elementu przypisana.
W tym celu korzystamy z metody
stopImmediatePropagation i ona oczywiście nie musi być używana razem z tą.
Ta nie jest potrzebna
wtedy, zobaczmy.
Klikam w przycisk i widzimy tylko Kliknąłeś w przycisk.
Czyli nawet ta kolejna funkcja nie została wywołana.
To może być przydatne w bardzo specyficznych przypadkach, ale gdzieś
sobie to zanotuj i zapamiętaj, że jest taka możliwość.
Zostawimy sobie tutaj może jedno i drugie.
A na koniec przejdę na Eduweb i pokażę Ci
praktyczny przykład, kiedy stopPropagation może być przydatne.
Jesteśmy na Eduweb i mamy tutaj coś takiego, że jak najedziemy na ten header
to zauważ, że nam się pojawia wyszukiwarka i menu i tutaj jest przypisane zdarzenie
nie kliknięcia i nie click ale mouseenter czyli po najechaniu myszą
tutaj sobie wykonujemy jakiś kod który nam to pokazuje.
I problem jaki mieliśmy jest taki, że tutaj mamy taki widget z zespołami i po
najechaniu na niego chcemy go po prostu rozwijać.
Problem był po prostu taki, że skoro
mamy do całego tego górnego paska przypisane zdarzenie, że na mouseenter
chcemy zrobić coś takiego, zakrywało nam to te zespoły. I w momencie kiedy najechało by
się na te zespoły, no to działo się dokładnie coś takiego jak teraz.
I to jest idealny przykład tego jak wykorzystać stopPropagation.
A więc do tego elementu, który jest tutaj przypisałem zdarzenie mouseenter, czyli
że po najechaniu na ten element chcemy go w jakiś taki sposób rozwijać,
ale od razu dodałem tam również stopPropagation.
I to oznacza, że jak najedziemy na ten element również
najechaliśmy na cały ten pasek, ale ten
pasek o tym nie wie mimo tego, że do niego jest przypisane też takie zdarzenie.
Więc tutaj stopPropagation było wręcz niezbędne.
Jeżeli bym tego nie dodał to po najechaniu
na ten element ten cały element zauważał, że przecież też na niego najechaliśmy, no i
wykonywał dokładnie taką akcję jak tutaj widzisz.
Natomiast stopPropagation po najechaniu na ten element sprawiło, że cały ten pasek nie
otrzymał zdarzenia mouseenter i dzięki temu możemy pozostać w takim stanie nie
zamieniając tego na pasek z wyszukiwarką i z menu.