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.
Przechodzimy do wykonania już trochę bardziej ambitnego projektu, który połączy
całą dotychczasową wiedzę z zakresu samego języka JavaScript, jak i obiektowego
modelu dokumentu, którą zdążyłem Ci już przekazać.
I będzie to tooltip, czyli taki dymek,
który się wyświetla po najechaniu na niektóre elementy.
Teraz na tej stronie mam kilka elementów, którym przypisałem atrybut title.
Zobacz np.
do tego obrazka przypisałem title albo
gdzieś tutaj wewnątrz paragrafu mamy strong z tytułem i mamy np.
również tutaj tytuł.
Generalnie będziemy chcieli stworzyć taki
Tooltip, który będzie przypisany do wszystkich tych elementów, które mają
atrybut title. Ale zobaczmy jak się ten atrybut zachowuje domyślnie w
przeglądarce. Więc po najechaniu na ten obrazek jak chwilę poczekam
zauważ, że przy kusorze pojawia się właśnie taki dymek,
fotografia z pierwszego miejsca, tutaj również on się pojawi czy np.
tutaj. Ale my chcemy stworzyć swój własny dymek, który przy takich elementach będzie
się pojawiał nad nimi tutaj i dokładnie na środku takiego elementu, a także będziemy
chcieli sprawić, żeby nie pojawiał się ten oryginalny title.
I to wszystko pokażę Ci w tej lekcji.
Na początek pokażę Ci jak taki Tooltip
wygląda, bo oczywiście ja musiałem go wcześniej przygotować.
Czyli mam do niego jakiś CSS.
On będzie pozycjonowany absolutnie.
Będziemy go wstawiać do body, no i tutaj są do niego odpowiednie style,
więc nie będziemy się zajmować tym, jak takie style stworzyć,
ale pokażę Ci, że jak utworzymy element
edu-tooltip i wstawimy go sobie na stronę do body bo będziemy go chcieli wstawiać do body, nie
tam gdzie są te elementy, nad którymi ma się pojawiać, ale bezpośrednio w body i
będzie tak pozycjonowany żeby się nad tymi elementami znalazł.
To jak utworzymy takiego div.edu-tooltip
w ten sposób i tutaj mu wstawimy jakąś treść,
zobacz jak to wygląda na stronie.
Dokładnie w ten sposób ten tooltip wygląda
tylko, że on się pojawił na końcu body.
Ale już ma przypisane coś takiego jak position absolute,
więc gdybyśmy teraz zaczęli manipulować
wpisując tutaj jego stylami takimi jak top np.
100 pikseli i left powiedzmy 300 pikseli to zauważ, że on się pojawia tutaj.
No i to jest dokładnie to co będziemy chcieli zrobić, a więc po najechaniu na
jakiś element będziemy chcieli odczytać jego atrybut title, utworzyć dynamicznie
takiego div, wstawić go na stronę i ustawić go na nad tym elementem, na który
najechaliśmy, więc będziemy musieli odczytać gdzie ten element się znajduje.
Po zjechaniu myszką z takiego elementu
będziemy chcieli ten div z body po prostu usunąć.
Więc zabierzmy się za pracę.
Ja to po prostu stąd wyrzucę
i przejdziemy sobie do pliku main.js, w którym napisałem trochę założeń.
Zaczniemy od pierwszego, czyli przypisz zdarzenie mouseenter.
A więc po najechaniu myszą chcemy wywołać
jakąś funkcję do wszystkich przekazanych elementów.
A więc będę chciał stworzyć sobie to trochę dynamicznie, czyli utworzyć funkcję
init, która będzie nam inicjować cały ten kod.
Potem sobie na końcu jeszcze to zawrzemy w takim module.
I co ja bym chciał zrobić? Chciałbym móc do tej funkcji przekazać, do
których elementów ja chcę tego tooltip przypisać.
A więc wszystkie elementy na stronie, które mają atrybut title, chcę żeby były
brane pod uwagę. Więc możemy te elementy wyszukać
i zaraz to zrobimy.
Napiszmy sobie tutaj elems i teraz będę chciał wywołać funkcję init
i te elementy tam przekazać za pomocą document.querySelectorAll
wyszukamy na stronie wszystkich elementów, które mają atrybut title. Czyli
w ten sposób te elementy zostaną znalezione i wstawiam je do funkcji init.
Dzięki temu to jest po prostu bardziej dynamiczne. A więc pod elems
wewnątrz tej funkcji znajdują się wszystkie elementy, które mają atrybut
title i zgodnie z punktem pierwszym chcemy do każdego z nich przypisać
zdarzenie mouseenter i jakąś funkcję, którą za chwilę będziemy tworzyć.
Skoro elems to jest taki obiekt tablicopodobny zwrócony z querySelectorAll, o
tym już w tym kursie dokładnie mówiłem, to możemy na nim wykonać sobie taką pętlę
for, która przypisze nam odpowiednie zdarzenia.
Zanim to jednak zrobimy, to chciałbym utworzyć funkcję, którą potem uzupełnimy.
Nazwiemy ją showTooltip i będziemy chcieli właśnie po najechaniu
na taki element wywołać dokładnie tę funkcję.
Czyli tutaj moglibyśmy skorzystać z tej pętli for np.
for of, a więc do wszystkich elementów za pomocą for, powiedzmy let elem of elems,
też to dokładnie pokazywałem już w tym kursie.
A więc do każdego elementu chcemy
przypisać zdarzenie za pomocą elem.addEventListener,
jeżeli przeskoczyłeś to tej lekcji, a nie
oglądałeś wszystkich po kolei to gwarantuję Ci, że to wszystko wcześniej
już tłumaczyłem i powinieneś w te miejsca się przenieść.
Czyli do danego elementu będę chciał
przypisać zdarzenie, które nazywa się mouseenter,
kiedy ktoś najedzie myszą na ten element, to chcę wywołać funkcję showTooltip.
W ten oto sposób.
A więc wywołaliśmy funkcję init,
przekazaliśmy wszystkie elementy, które mają atrybut title,
do każdego z nich przypisaliśmy po najechaniu myszą wywołanie tej właśnie funkcji.
Ta funkcja oczywiście automatycznie
otrzyma tutaj obiekt Event, który będziemy sobie mogli wywołać.
Możemy na początek po prostu go wyświetlić,
zapiszemy to wszystko
i teraz przejdziemy do konsoli.
OK, tutaj mamy jakiś błąd, tutaj jest literówka.
Zabrakło e. Zobaczmy.
Teraz już nie ma błędu i po najechaniu na
obrazek, który miał atrybut title, ten jego event się tutaj wyświetla,
po najechaniu na ten element również i na ten link również.
A więc część pracy już wykonaliśmy, bo
wszystkie elementy, które mają atrybut title to po najechaniu na nie coś się
dzieje, a więc wywołuje się funkcja showTooltip.
Teraz w punkcie drugim napisałem, że po
najechaniu na taki element chcielibyśmy odczytać jego pozycję na stronie.
To jest coś, co również jest w osobnej lekcji.
W razie czego sobie do niej wróć.
A więc jeżeli pod e
mamy event, to pod e.currentTarget będziemy mogli sobie odczytać odwołanie do
elementu, na który aktualnie najechaliśmy myszą.
A więc e.currentTarget zwróci nam dokładnie odwołanie do takiego elementu.
I na takim elemencie możemy odczytać jego
pozycję za pomocą metody getBoundingClientRect, którą Ci wcześniej pokazywałem.
Zatem będę chciał sobie to zapisać w
takiej stałej, którą nazwałem po prostu pos.
Odwołamy się do currentTarget, czyli do elementu, na który najechaliśmy i do metody
getBoundingClientRect, upewnijmy się, że tutaj jest OK getBounding.
Tutaj powinno być jeszcze e, czyli getBoundingClientRect,
sprawdźmy w konsoli znowu co tam się znalazło.
Po najechaniu na taki element widzimy gdzie on jest usadowiony na stronie. I
dzięki temu będziemy mogli nasz Tooltip również w odpowiednim miejscu wstawić.
Zobaczmy zatem jaki jest kolejny punkt.
Punkt trzeci, stwórz dynamicznie element Tooltip.
No właśnie, więc teraz chcemy utworzyć takiego div z klasą edu-tooltip
jak tutaj
wcześniej go wstawiałem. Żeby sobie nie śmiecić w funkcji showTooltip
utworzymy nową funkcję, którą nazwiemy createTooltip.
Chciałbym, żeby ta funkcja otrzymywała tekst, który ma być wstawiony do tego tooltipa.
Więc będziemy chcieli tutaj ją wywołać, a więc po najechaniu na jakiś
element będziemy chcieli po pierwsze odczytać tekst jaki jest w atrybucie
title, czyli powiedzmy najechaliśmy na obrazek,
chciałbym ten tekst fotografia z pierwszego miejsca odczytać.
Jak to zrobimy? Napiszmy sobie const text
i odwołamy się znowu do e.currentTarget i do getAttribute,
też to pokazywałem już w tym kursie i odczytamy jego atrybut title.
Następnie ten tekst będę chciał przekazać do funkcji createTooltip, a więc po prostu
ją wywołajmy createTooltip i przekażemy jej text.
Co za tym idzie, teraz po najechaniu na dowolny element tak naprawdę wywołuje się
również funkcja createTooltip, która otrzymuje ten text.
Podejrzyjmy to sobie.
Jak widzisz dokładnie tak jest.
Po najechaniu na element,
który ma atrybut title otrzymujemy go tutaj i wyświetlamy na razie w konsoli.
Zajmiemy się zatem utworzeniem tego div, o którym wspomniałem.
Możemy to zrobić w ten sposób, że
napiszemy sobie tutaj Tooltip i za pomocą metody createElement utworzymy element div.
Teraz ten przekazany tekst będziemy
chcieli oczywiście ustawić jako text tego div, więc odwołam się do tooltip
i możemy za pomocą właściwości text content tenże text właśnie tam przypisać.
No i teraz ten tooltip również powinien mieć
klasę ebu-tooltip, a także żeby on był ukryty, ale tym się zajmiemy
za chwilę będzie miał klasę hidden.
Ta klasa będzie potrzebna później, więc na razie dodajmy do niego tylko tę jedną
klasę, a więc napiszemy tooltip i możemy zrobić classList.add,
żeby dodać jakieś klasy albo jeżeli on nie miał żadnych klas, to możemy takim
skrótem className przypisać po prostu wszystkie klasy, jakie są tam potrzebne.
Na razie jest nam potrzebna tylko klasa edu-tooltip.
W ten sposób.
I może zamienię sobie to kolejnością, chociaż to nie ma tutaj znaczenia.
Utworzyłem div, przypisałem mu klasę, przypisałem mu jego tekst, no i teraz tego
div będę chciał po prostu wstawić na stronę.
A więc będę chciał zrobić document.body,
czyli odwołać się do elementu body takim skrótem i następnie append
i dodamy sobie tutaj tooltip. Wszystkie rzeczy, które teraz pokazuję
ja ich nie tłumaczę np.
jak działa append, bo każda z nich była tłumaczona w osobnej lekcji.
OK, zobaczmy co się stanie teraz po
najechaniu na dowolny element, jego tooltip pojawia się w body.
Jak najedziemy na inny to kolejny tooltip się pojawia itd.
Więc będziemy się chcieli zająć jeszcze tym, żeby mieć tylko jeden tooltip. Ale
żeby te lekcje nie były zbyt długie, to zajmiemy się tym w lekcji kolejnej.