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.
Pokazywałem Ci przy okazji tworzenia elementów HTML, że możemy tworzyć również
węzły tekstowe i w ten sposób jakby zarządzać treścią tekstową elementów.
Natomiast mamy dwie fajne właściwości, które w dużo prostszy sposób pozwolą nam
ustawić jakąś treść HTML, a także treść tekstową dowolnego elementu
i to będę chciał Ci teraz pokazać, ale
najpierw pokażę Ci, jak możemy za pomocą tych właściwości odczytywać jaki HTML
znajduje się w elemencie albo jaki tekst tam się znajduje.
Zatem pobierzemy sobie może do zmiennej cały ten kontener,
za pomocą oczywiście document.querySelector po klasie container.
I teraz, jeżeli chcielibyśmy odczytać jego
wewnętrzny HTML, czyli to co tam jest w środku i pobrać sobie to jako string
i to jest bardzo ważne, bo jeżeli przeczesywaliśmy to drzewo np.
z użyciem właściwości children, którą Ci pokazałem, to ona nam zwracała obiekty,
które są wewnątrz. Obiekty reprezentujące np.
h1, h2 czy paragraf, na których mogliśmy wykonywać pewne operacje.
Natomiast jeżeli chciałbym do języka
JavaScript zwrócić sobie string z całym kodem HTML, to mogę to
zrobić za pomocą właściwości innerHTML, ale to będzie string, czyli dokładnie tak
samo jakbym sobie to skopiował i jakbym sobie utworzył taką stałą
html i powiedzmy w takim Template String jakbym sobie to zapisał.
Czyli to jest teraz string,
to nie są żadne elementy html.
Więc jak taki inner html sobie odczytać? Zrobimy to od razu
w konsoli. Odwołamy się do container i mamy właściwość innerHTML.
Ona wygląda dokładnie tak.
I w dowolnym momencie możemy z niej skorzystać i zauważ, że
zwróci nam to dokładnie taki HTML jak znajduje się w tym kontenerze, włącznie z
tymi wszystkimi wcięciami, które są zrobione w kodzie.
Odczytywanie samego HTML może nie często
jest bardzo przydatne, chyba że chcielibyśmy to w jakiś sposób analizować
albo gdzieś sobie przechować, zmienić treść elementu, potem to z powrotem
wstawić, ale bardzo często będziemy sobie mogli w ten sposób ustawiać HTML wewnętrzny.
Czyli ta właściwość innerHTML
jest nie tylko do odczytu, ale również możemy ją ustawić.
Zobacz, jeżeli byśmy sobie tutaj zrobili container.innerHTML
i ustawimy mu tutaj podając string jakiś inny HTML,
możemy również to podać w Template String
żeby można było to złamać na wiele linii to możemy powiedzieć, że chcemy cały ten
wewnętrzny html tego kontenera ustawić na coś zupełnie innego.
Na przykład niech tam będzie h3
i napiszemy nagłówek h3 i powiedzmy, że tylko tyle,
nie będę nic więcej tutaj wstawiał. Tu możemy sobie zakończyć tę linijkę średnikiem.
Po wykonaniu takiego kodu, zobacz na stronie zostanie tutaj tylko nagłówek h3.
I co ciekawe my podaliśmy string, ale przeglądarka kiedy ten innerHTML
ustawiała oczywiście musiała utworzyć te elementy, więc teraz na stronie moglibyśmy
wyszukać takiego elementu h3 albo odwołać się do container
Children i tam mielibyśmy wśród dzieci właśnie ten element h3, a nie byłoby już
tam pozostałych elementów, które właśnie zostały usunięte.
Wykomentują jednak tę linijkę, żebyśmy tego nie ustawiali.
I teraz pokażę Ci, że możemy podobnie robić z treścią tekstową elementów.
Czyli powiedzmy wyszukajemy sobie tego paragrafu.
Będzie łatwo go znaleźć, bo jest tylko jeden na stronie, więc w
zasadzie wystarczy, że zrobimy querySelektor p.
I teraz będę chciał zmienić treść tego paragrafu.
Mamy treść paragrafu.
Chciałbym to ustawić na nowa treść paragrafu.
Co ciekawe moglibyśmy to zrobić z użyciem
innerHTML i tutaj wcale nie musimy podawać jakiś elementów HTML -owych.
Możemy po prostu powiedzieć Nowa treść paragrafu i to też nam zadziała.
Natomiast kiedy wiemy, że chcemy pracować
tylko z tekstem, to powinniśmy korzystać z właściwości textContent. I ona po pierwsze
co Ci pokaże pozwoli nam odczytać ten tekst
i do języka JavaScript
tutaj zwraca nam to po prostu jako string. Zobacz.
Wyświetli się to w konsoli.
Odczytaliśmy tekst jaki tam się znajdował.
A po drugie będziemy mogli również
ustawiać nowy tekst, czyli tutaj napiszemy textContent.
Zaraz Ci jeszcze pokażę, czym to się różni od innerHTML.
Ustawiłem sobie nowa treść paragrafu.
Otóż jeżeli tutaj chciałbym sobie podać w
środku, że jest jakiś element span, czyli podałem jakiś kod html,
zauważ co stanie się na stronie.
Ten span nie zostanie potraktowane jako normalny element html, tylko będzie tutaj
po prostu wyświetlony. Czyli jak byśmy sobie zerknęli,
będzie to wyglądać w ten sposób.
Natomiast jeżeli chcielibyśmy, żeby takie elementy wewnątrz tego stringa były
traktowane jak elementy html, wtedy należy korzystać z innerHTML.
I podobnie jest przy odczytywaniu. Jak tutaj sobie odczytaliśmy container.innerHTML
to widzisz, że nam to zwróciło dokładnie kod HTML.
A gdybym odczytał textContent,
zobacz,
zwróciłoby nam to same węzły tekstowe
można powiedzieć w formie stringu. Czyli zostały wycięte wszystkie elementy HTML,
ale cała zawartość tekstowa z wszystkich tych elementów została tutaj zwrócona.
Cofnę jednak do takiej postaci.
Na koniec pokażę Ci jeszcze, że możemy odczytywać i ustawiać outerHTML, czyli
w momencie kiedy zrobiliśmy container.innerHTML to odczytaliśmy sobie to,
co jest wewnątrz takiego kontenera, czyli dokładnie to wszystko,
a gdybyśmy chcieli odczytać kod wraz z tym elementem, czyli jakby cały ten element i
jego zawartość, to moglibyśmy zrobić console.log
container.outrerHTML
w ten sposób zobacz.
I teraz otrzymaliśmy tutaj cały ten kod wraz z tym elementem.
I gdybyś przypisał outerHTML na coś
innego, to tak naprawdę zamienisz cały ten element na nowy kod, który podasz.
Jak zatem widzisz, w ten sposób można pracować z treścią elementów.
Jeżeli jest to treść tekstowa, można ją
odczytać za pomocą textContent i ustawić również w ten sposób.
Jeżeli chodzi o kod HTML, możemy to odczytać i ustawić za pomocą innerHTML.
I teraz to, co jest bardzo ważne, tutaj być może widzisz jaka jest różnica pomiędzy
tym a manualnym tworzeniem poszczególnych elementów i wstawianiem ich z użyciem np.
append. Chodzi tutaj o to, że możemy od razu podać
cały string jaki chcemy ustawić tak jak tutaj
zrobiłem to w tym przypadku.
Możemy podać od razu dużo elementów i
chcemy taki wewnętrzny HTML na kontenerze ustawić.
Natomiast gdybyśmy chcieli je pojedynczo
tworzyć, musielibyśmy za pomocą createElement utworzyć h3,
potem np. jakiegoś div, gdybyśmy również go tutaj
chcieli i pojedynczo musielibyśmy je wstawiać do takiego elementu.
To nie oznacza, że tworzenie elementów i korzystanie np. z append nie ma sensu.
Jak najbardziej ma sens np. jak byśmy chcieli stworzyć dynamiczny przycisk,
wstawić go gdzieś do strony czy jak byśmy chcieli stworzyć link i nie nadpisywać
całego HTML -u jakiegoś kontenera, ale tylko dodać do niego taki element.
Wtedy jak najbardziej warto to robić,
natomiast jeżeli są sytuacje gdzie cały
HTML chcemy zmienić, wtedy możemy skorzystać z innerHTML.