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.
Pozostało nam do zrobienia jeszcze kilka drobnych rzeczy z naszym tooltipem i myślę,
że w tej lekcji już uda nam się je wszystkie zakończyć.
Więc ten tooltip teraz działa tak, że po najechaniu
na element, do którego go przypisaliśmy pojawia się w odpowiednim miejscu,
ale po pierwsze jak widzisz koło kursora
myszy pojawia się nam oryginalny title, a chcemy się go pozbyć, a po drugie
chcielibyśmy po zjechaniu myszą również ukrywać ten tooltip.
Więc przejdźmy sobie do naszych założeń I zrobiliśmy punkt czwarty w lekcji
poprzedniej, więc chciałbym teraz zająć się punktem pierwszym.
A więc przypisz zdarzenie mouseleave do wszystkich przekazanych elementów.
Zatem tutaj jak przypisywaliśmy takie zdarzenie jak mouseenter to chciałbym od razu
przypisać zdarzenie mouseleave i to zdarzenie się wywołuje kiedy
zjedziemy kursorem myszy z jakiegoś elementu i tutaj będziemy chcieli
wywoływać funkcję, którą nazwiemy sobie heideTooltip.
A zatem utwórzmy sobie taką funkcję
hideTooltip i ją tutaj po prostu przypiszemy.
OK, i teraz ta funkcja się będzie wywoływać. Ale zastanówmy się co się
stanie jak my zjedziemy z takiego elementu.
Wywołamy funkcję, ale skąd będziemy wiedzieć, który tooltip jest aktywny?
No i można by było zrobić tak, że na
stronie wyszukamy z użyciem querySelektor tego elementu i go usuniemy, ale można to
również zrobić w bardziej wydajny i lepszy sposób.
To znaczy w momencie kiedy tworzymy tooltip,
to przypisywać go do jakiejś globalnej zmiennej.
Więc jeżeli byśmy sobie tutaj utworzyli zmienną, którą nazwiemy activeTooltip, bo zawsze na
stronie będzie tylko jeden taki aktywny tooltip, może być ona pusta, albo możemy
przypisać tutaj wartość null, żeby zasygnalizować, że na początku specjalnie
nic w niej nie ma, to teraz w momencie jak taki tooltip tworzymy to moglibyśmy go
przypisywać do tej zmiennej activeTooltip.
Czyli na tym etapie utworzyliśmy tooltip i moglibyśmy go tutaj po prostu zapisać.
W zasadzie można to zrobić w tym miejscu.
activeTooltip równa się tooltip.
OK, mam nadzieję, że to rozumiesz. Czyli utworzyliśmy element,
wstawiliśmy go na stronę, ale odwołanie do
niego mamy w takiej globalnej tutaj zmiennej, którą sobie utworzyliśmy.
I to odwołanie jest takie samo jak tutaj, jak w każdym innym miejscu, więc na nim możemy
wtedy wszystkie te metody wywoływać. I dzięki temu to nam ułatwi bardzo sprawę.
Bo jak sobie skopiujemy tą zmienną to w funkcji hideTooltip
wystarczy się do tego tooltip odwołać i
pokazywałem Ci, że możemy w drzewie DOM usuwać elementy metodą remove.
One wtedy znikają.
A zatem po zjechaniu myszy z dowolnego
elementu będziemy aktywny tooltip chcieli usunąć.
Natomiast tutaj fajnie byłoby zadbać o to, czy taki tooltip na pewno istnieje.
On się będzie tworzył i będzie istniał,
ale ja dla pewności sprawdziłbym sobie czy tutaj nie ma wartości null, bo jak na null
spróbujemy wykonać remove to otrzymamy błąd, więc najbezpieczniej będzie sprawdzić.
Jeżeli activeTooltip,
czyli jeżeli tam będzie odwołanie do obiektu to będzie uznane jako wartość
prawdziwa, jeżeli null to jako false i tylko wtedy chcemy usunąć.
W zasadzie ta sytuacja nie powinna mieć miejsca, bo po zjechaniu elementu kiedy
będziemy to oznacza, że najpierw na niego najechaliśmy i ten tooltip utworzyliśmy, ale
lepiej sobie również takie zabezpieczenie stworzyć na wszelki wypadek.
OK, no i zobaczmy jak to będzie działać.
Najeżdżam na ten element, zjeżdżam z niego i Tooltip znika. Bo on jest po prostu z
drzewa DOM, co możesz po prawej stronie zobaczyć usuwany.
I o to nam dokładnie chodziło.
Więc zanim zdążymy najechać na inny
element, on już jest usunięty i dopiero wtedy tworzy się nowy i on się usuwa.
Kolejną rzeczą, którą chcę zrobić to jest usunięcie atrybutu title na danym
elemencie po to, żeby on się nie pojawiał razem z tym tooltipem.
I to możemy zrobić.
Przejdziemy sobie w miejsce, w którym w
zasadzie tworzymy taki Tooltip, czyli będzie to tutaj, odczytaliśmy z
elementu, na który najechaliśmy jego atrybut title, przekazaliśmy go tutaj do
tooltipa, no i w zasadzie możemy ten atrybut usunąć.
A więc powiemy e.currentTarget.removeAttribute title.
Skoro go usuniemy, no to on po prostu nie
będzie nam się wyświetlał. Najeżdża na element,
pojawia się tooltip, ale jak widzisz nie
pojawia się już ten dymek, bo usunęliśmy atrybut title.
Natomiast jak zjedziemy z tego elementu,
najedziemy jeszcze raz, to jak widzisz tooltip przestał działać.
Dlaczego? Dlatego, że po najechaniu na ten element
otrzymywaliśmy jego atrybut title i przekazywaliśmy ten tekst do tooltipa.
Skoro ja go za pierwszym razem usunąłem,
to za drugim razem jak chcę go odczytać, to otrzymuję pusty ciąg znaków.
A zatem po zjechaniu z takiego tooltipa chcielibyśmy do takiego elementu przypisać
raz jeszcze atrybut title. I możemy to zrobić.
Przechwycimy sobie tutaj e przy hideTooltip, a więc
przechwycimy dokładnie ten element, z którego zjechaliśmy myszą.
Skoro na nim mieliśmy mysz, to znaczy, że
w tooltipie znajduje się taki tekst, jaki wcześniej był w atrybucie title
a zatem ten tekst możemy odczytać i z powrotem ustawić ten title.
Zrobimy to zanim usuniemy ten element, a więc odwołamy się do e.currentTarget
i w tym miejscu to będzie właśnie ten element, z którego zjechaliśmy myszą
i któremu przy najechaniu myszą usunęliśmy atrybut title i ustawimy jego atrybut
title na wartość pobraną z tooltipa, a więc activeTooltip i textContent.
To będzie dokładnie ta wartość, która się w środku tego div z Tooltip znajduje.
Odczytamy ją i przypiszemy z powrotem jako atrybut title.
Zobaczmy.
Zjeżdżam, najeżdżam i jak widzisz za każdym razem działa to poprawnie.
Bo teraz jeżeli sobie zerkniemy po prostu
na ten obrazek, to on z powrotem ma przypisany atrybut title.
Teraz jak najade ten atrybut jak widzisz
po prawej stronie jest usunięty, ale jest w dymku.
Przy zjechaniu odczytuję go z dymka, ustawiam tutaj i dymek usuwam.
No i jak widzisz działa to już bardzo fajnie.
No i w zasadzie można powiedzieć, że nasz tooltip jest już gotowy, ale chciałem Ci
na koniec pokazać jak to wszystko zawrzeć w fajnym module.
Bo mamy to jak widzisz w punkcie 7.
Teraz te wszystkie funkcje są globalne,
czyli wszędzie się do nich można odwołać np.
createTooltip
I podobnie jak ktoś by miał więcej skryptów podpiętych do naszej strony, to wszędzie
będą te funkcje dostępne zupełnie niepotrzebnie.
Natomiast możemy wszystkie te funkcje
zawrzeć sobie w takiej samo wywołującej się funkcji anonimowej.
Czyli zrobimy to tak, utworzymy funkcję,
następnie tę funkcję wywołamy czyli tutaj
ona się tworzy i od razu wykonuje
i wszystko, co tutaj mieliśmy,
oprócz tego init, bo zaraz coś z tym będę chciał zrobić,
albo na początek możemy również z tym init.
Wstawimy sobie do tej właśnie funkcji.
Sformatuję to jeszcze.
OK. I tak to będzie wyglądać.
Na tym etapie ten kod będzie działał tak
samo jak widzisz, ale już nie będziemy mieli w globalnym zakresie np.
funkcji createTooltip.
Ale to co ja chciałbym zrobić, to do
globalnego zakresu wypuścić taką funkcję, która będzie nam to wszystko inicjowana.
A zatem nie chcę tego wywoływać wewnątrz
naszej funkcji, tylko chcę móc wywołać sobie to tutaj.
Czyli moglibyśmy wtedy taki skrypt
podłączyć do naszej strony i mielibyśmy całą funkcjonalność tooltipa
a naszym zadaniem albo zadaniem kogoś
innego byłoby wyłącznie wywołanie odpowiedniej funkcji i przekazanie
elementów, do których ten tooltip ma być przypisany.
Natomiast teraz na zewnątrz funkcja init nie jest dostępna.
Wystarczy jednak, że do obiektu window przypiszemy tą funkcję init w ten sposób.
Czyli wskażemy na funkcję init, która jest
wewnątrz tutaj i przypiszemy to do window.init.
Dzięki temu tutaj w globalnym zakresie
będzie już dostępna taka funkcja i wszystko powinno działać tak samo.
Natomiast niezbyt intuicyjnie to brzmi.
Jeżeli byśmy komuś udostępnili taki skrypt
i nazwalibyśmy funkcję do wywoływania tooltip po prostu init.
A zatem przypisując ją do obiektu
globalnego jakim jest window, możemy ją nazwać inaczej np.
makeTooltip
w ten sposób i przypiszemy tutaj funkcję init.
I teraz możemy tak naprawdę zapomnieć o tym kodzie, który był wyżej.
Wiemy, że mamy globalną funkcję, która nazywa się makeTooltip coś takiego,
przekazujemy jej odpowiednie elementy, wywołując makeTooltip
tak naprawdę wywołujemy init i tutaj wszystko dzieje się dokładnie tak samo,
jak stworzyliśmy to na przestrzeni ostatnich lekcji.
Zobacz jak to teraz wygląda.
Wygląda tak samo, ale jest w lepszy sposób spakowane i w zasadzie moglibyśmy cały ten
kod oprócz tej ostatniej funkcji zawrzeć w skrypcie i komuś ten skrypt podrzucić,
on sobie go podłącza do strony i w dowolnym miejscu
nawet tutaj w liniowym skrypcie mógłby
powiedzieć makeTooltip i podać elementy, które mają być do tego
Tooltipa przypisane, a w zasadzie do których Tooltip ma być przypisany.
Jak zatem widzisz w ten sposób można stworzyć fajny moduł.
Ja jednak zostawiam to wywołanie tutaj, żebyś łatwiej mógł po prostu na to
zerknąć, ale nic nie stoi na przeszkodzie, żeby cały ten kod był po prostu w jednym
pliku, a wywołanie w zupełnie innym miejscu.
To zatem tyle jeżeli chodzi o ten Tooltip.
Jak widzisz dosyć długi projekt, ale chciałem Ci na jego podstawie pokazać jak
możemy pracować zarówno z językiem JavaScript, bo tutaj wszędzie pisaliśmy
wyłącznie kod JavaScript, czyli tworzyliśmy jakieś obiekty, gdzie coś
sobie powstawialiśmy, poprzekazywaliśmy to do innych funkcji,
podzieliliśmy to fajnie na kilka funkcji,
ale także jak pracować z obiektowym modelem dokumentu, czyli jak połączyć
wiedzę, którą do tej pory w osobnych lekcjach Ci pokazywałem.
Jak widzisz, efekt jest naprawdę fajny, a
to tylko ułamek tego, co możemy z użyciem Obiektowego Modelu Dokumentu i języka
JavaScript robić na stronach internetowych.