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 pomówimy trochę o relacjach
między elementami w Obiektowym Modelu Dokumentu
i mam na myśli takie relacje jak w rodzinie,
czyli dzieci, czyli rodzice, czyli rodzeństwo.
I teraz jak sobie rzucimy okiem na tę listę ul, to powiedzmy dla tego elementu
li jego rodzeństwem będą wszystkie te elementy, które znajdują się obok niego,
natomiast jego rodzicem będzie ten element ul.
Dla tego elementu ul rodzeństwem będzie h1
a rodzicem będzie ten element container,
z kolei section będzie jakimś przodkiem.
Dlaczego to jest istotne?
Otóż dlatego, że mając uchwyt do jakiegoś
elementu powiedzmy jak sobie wyszukamy ten element ul w drzewie DOM
i zrobiłem to już tutaj możemy się odwołać właśnie do jego dzieci, rodzeństwa itd.
Będę chciał Ci pokazać na czym to polega.
Najpierw będę chciał się odwołać do wszystkich dzieci tego elementu ul.
Więc utworzymy sobie taką stałą children i mając już odwołanie do tej listy
napiszemy childNodes. I teraz wyświetle sobie to w konsoli.
W zasadzie możemy to od razu zrobić w
przeglądarce, children, bo chcę Ci pokazać co tam się znajdzie.
Mamy jakąś kolekcję NodeList.
Jeżeli to jest kolekcja to jest to obiekt tablicopodobny, gdzie możemy po prostu w
ten sposób się odwoływać do elementów, czyli użyć tego w pętli for i tak dalej.
Ale jak sobie podejrzymy co dokładnie tam jest to zauważ, że dziwnie to wygląda, bo mamy
jakiś tekst, potem li, potem znowu tekst itd.
Tutaj na przykład mamy komentarz. Chcę Ci powiedzieć dlaczego tak jest.
Otóż tak naprawdę my tego nie widzimy, ale wewnątrz tego elementu
ul mamy tekst i tym tekstem jest choćby tego się nawet nie da zaznaczyć,
ale tutaj ten odstęp, ten tabulator.
Gdybyśmy zrobili tak, to nie byłoby tutaj tego pierwszego dziecka,
natomiast jak ja zapiszę, to edytor mi to reformatuje.
Czyli można powiedzieć, że childNodes zwraca nam kolekcję wszystkich dzieci, nie tylko
elementów HTML, ale także węzłów tekstowych czy np.
komentarz.
To nie jest zbyt przydatne w takiej
codziennej pracy, ale warto wiedzieć, że komentarz też jest swego rodzaju węzłem w
Obiektowym Modelu Dokumentu, na którym moglibyśmy wykonywać jakieś czynności.
Nam to nie będzie potrzebne,
ale widzisz już teraz, że childNodes
zwraca nam wszystkie dzieci danego elementu, no i w tym przypadku
może to dla nas nie być jakby pożądana akcja, czyli to, co chcemy uzyskać.
Dlatego możemy zrobić również podobną rzecz i napisać elementChildren
i odwołamy się do tej listy i następnie do children.
To się różni od tego zapisu tym, że zwraca nam tylko elementy HTML, czyli tylko te
dzieci, które są prawdziwymi elementami HTML a więc będą to te elementy li.
Zobaczmy teraz, element children zwraca nam HTML Collection.
To znowu jest taki obiekt tablicopodobny i mamy tutaj tylko elementy li.
Więc to może być w wielu sytuacjach po prostu to, czego potrzebujesz.
Mamy jeszcze kilka ciekawych skrótów, które chciałbym Ci pokazać.
Na przykład możemy powiedzieć first
i w tej liście ul wyszukać sobie firstChild
i to nam zwróci znowu pierwsze dziecko, którym w tym przypadku będzie
jakiś tekst, który tutaj jest taki nowy wiersz i tabulator,
my tego tutaj nie widzimy, ale dokładnie to będzie to.
Natomiast możemy powiedzieć firstElement
i wtedy odwołujemy się do tej listy i mówimy firstElementChild.
Więc też zazwyczaj to jest to, czego byśmy oczekiwali.
Oczywiście moglibyśmy również zrobić coś
takiego, czyli list.querySelector i podać CSS -owy selektor taki jak first-child.
To nam zwróci dokładnie to samo co taki zapis.
To jest tylko po prostu skrót
i jest to zapis, który istniał po prostu wcześniej.
Ja czasami z niego korzystam.
Podobnie będzie w przypadku last.
Możemy się odwołać do listy i powiedzieć lastChild.
W tym przypadku będzie to chyba komentarz, który tutaj dodaliśmy.
A może jeszcze jakiś tekst zanim się znajduje,
natomiast jeżeli powiemy lastElement,
to możemy skorzystać z właściwości, która nazywa się lastElementChild.
Oczywiście nie tylko na elemencie li można z
tego korzystać czy na elemencie ul, ale na dowolnym węźle, który się tutaj
znajduje, czyli na dowolnym elemencie HTML
możemy się w ten sposób odwoływać do jego dzieci.
Oczywiście, jeżeli takiego dziecka nie będzie, to tutaj zostanie zwrócone null.
Pokażę Ci teraz, że możemy również się odwoływać do rodzeństwa.
Powiedzmy, że mamy już pobrany ten
pierwszy element i chcielibyśmy zobaczyć, jaki jest jego następny
można powiedzieć brat czy jakieś jego
rodzeństwo, a więc kolejny element, który się za nim znajduje.
Skoro firstElement tutaj już nam zwróciło to pierwsze li
to możemy powiedzieć coś takiego jak second i odwołamy się do firstElement.
Czyli na dowolnym elemencie możesz się
odwołać do nextSibling, czyli następne rodzeństwo.
I znowu nextSibling może nam zwrócić
element, ale równie dobrze może zwrócić textNode.
Natomiast jeżeli będziemy chcieli
pobrać sobie konkretnie element, to wtedy mówimy nextElementsSibling.
Czyli jak widzisz to jest taka konwencja,
że wszędzie tutaj dodajemy element i wtedy mamy pewność, że nie zostanie zwrócony np.
węzeł tekstowy czy komentarz, ale konkretny element.
I zazwyczaj właśnie o to nam chodzi.
Podobnie możemy się odwołać do poprzedniego elementu.
Czyli powiedzmy będziemy chcieli się
odwołać do przedostatniego elementu, a więc napiszemy lastButOne,
coś takiego i odwołamy się tutaj, tym
razem do lastElement i do previousSiblingling
i teraz zrobimy lastButOneElement,
bo to previousSibling znowu tak jak wcześniej może nam zwrócić np.
węzeł tekstowy,
natomiast previousElementSibling zawsze zwróci nam poprzedni element.
A zatem jak odwołaliśmy się do ostatniego
li, czyli do tego i powiedzieliśmy previousElementSibling
zwróci nam to właśnie takie li.
No i na koniec pokażę Ci jeszcze, że możemy odwołać się do rodzica.
Więc mając uchwyt do jakiegoś elementu li, np.
do tego pierwszego elementu, jeżeli z
niego chcielibyśmy się odwołać do rodzica czy do ul, to moglibyśmy powiedzieć tak
parent równa się firstElement.parentNode.
Jak się możesz domyślić, gdybym tutaj
znowu napisał parentNode to odwołał bym się do kolejnego rodzica.
Czyli będąc już na ul dostałbym tego diva.
Czyli będę miał wtedy do niego odwołanie
dokładnie takie samo jak byśmy go znaleźli np. z użyciem querySelector.
Czyli wszystkie operacje na nim możesz normalnie wykonywać.
Nazwijmy sobie to może parentElement żeby
wiedzieć, że tutaj zawsze otrzymamy element taki HTML -owy.
I teraz na początku nauki tego obiektowego
modelu dokumentu możesz sobie zadawać pytanie kiedy z tego skorzystam?
Po co jest mi to potrzebne?
Oczywiście przede wszystkim chciałem Ci to wszystko pokazać, żebyś wiedział jakie są
możliwości przeskakiwania po tym drzewie DOM,
natomiast chcę Ci szybko podać taki
praktyczny przykład, gdzie mogłoby się to przydać, którego ja tutaj nie tworzyłem,
żeby nie tracić czasu, ale myślę, że jesteś w stanie sobie go wyobrazić.
Zobacz, mamy tutaj elementy listy i wyobraź sobie, że są to gwiazdki.
Jak mamy czasami takie systemy oceny,
piszemy jakiś komentarz i możemy zaznaczyć np.
od 1 do 5 gwiazdek.
Wyobraź sobie, że są to gwiazdki koło
siebie i będziemy chcieli przypisać zdarzenie po najechaniu myszą.
O zdarzeniach jeszcze powiem później w tym kursie, ale będziemy mogli zrobić tak, że
po najechaniu myszą na jakiś konkretny element wywoła się nasza funkcja.
I teraz w tej funkcji będziemy mieli dostęp do tego elementu.
Więc wyobraź sobie, że najechaliśmy na czwartą gwiazdkę,
jeżeli to byłyby gwiazdki i mam odwołanie do tego konkretnego elementu li. To na tym
elemencie mógłbym w pętli while zrobić sobie coś takiego while
previousSibling czyli tak długo jak jest zwracany previousSibling to będziemy chcieli
ten previousSibling, czyli takie li dodać sobie do jakiejś tablicy.
Pętla while znowu się wykona na tym jakby
elemencie, previousSibing znowu dodamy do tablicy i znowu dodamy.
W ten sposób po najechaniu na czwarty element moglibyśmy ten element oraz
wszystkie jego previousSibling dodać do jakiejś tablicy i w następnym kroku na
wszystkich tych elementach dodali byśmy np.
klasę isActive, która by sprawiła, że gwiazdki byłyby zaznaczone np.
na żółto.
Mam nadzieję, że jesteś sobie w stanie to wyobrazić.
Więc to byłby jeden z takich praktycznych
przykładów jak po najechaniu na czwartą gwiazdkę zaznaczyć tą czwartą i trzy
poprzednie dodając im jakieś klasy.
Więc właśnie w ten sposób byśmy to zrobili.
previousElementSibling i w takiej pętli while, czyli tak długo jak są poprzednie elementy
dodajemy sobie je do jakiejś tablicy, a potem na tej tablicy wykonujemy pętle i każdemu z tych
elementów dodajemy jakąś klasę, która podświetli taką gwiazdkę.
To zatem tyle, jeżeli chodzi o takie
najważniejsze właściwości obiektów, które pozwalają nam przeczesywać drzewo DOM.