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 tym praktycznym projekcie wykonamy sobie
prosty odtwarzacz wideo, który będzie wyglądał tak, jak teraz widzisz.
Niemniej jednak na razie jest to tylko HTML i CSS i kliknięcie np. tutaj w Play nic
nie daje, a te czasy są tutaj wpisane na sztywno.
Będziemy chcieli zrobić tak, aby to
wszystko było dynamiczne i aby po prostu działało.
Na początek pokażę Ci jak wygląda kod HTML
i skupmy się na razie na tym elemencie video.
Taki element jest dostępny w HTML i możemy mu podać atrybut stc do pliku video,
co dokładnie tutaj zrobiłem.
I powiem Ci teraz, że jeżeli dodali byśmy tutaj atrybut, który nazywa się controls
to automatycznie pojawią się tutaj kontrolki.
Jak widzisz ta pod spodem to jest moja,
którą ja dodałem, ale tutaj pojawiły się takie natywne kontrolki
i to wideo można odtwarzać, pauzować, zmieniać jego głośność itd.
Czyli można powiedzieć, że po dodaniu
takiego atrybutu wszystko co będziemy robić w tej lekcji nie miałoby sensu.
Niemniej jednak w każdej przeglądarce
inaczej będzie ten player domyślny wyglądał.
Dlatego jeżeli chciałbyś stworzyć swój własny odtwarzacz i chciałbyś, żeby on
wyglądał w każdej przeglądarce tak samo, wtedy musimy zrobić to wszystko ręcznie
i dokładnie to chcę Ci pokazać w tej lekcji.
Player, w którym odtwarzasz teraz to video na eduweb.pl został również napisany
całkowicie od zera, w trochę podobny sposób jak będziemy robić w tej lekcji,
ale ten nasz dzisiejszy będzie dużo, dużo prostszy.
I teraz zobacz co ja tutaj już przygotowałem.
Otóż napisałem ten markup, czyli HTML, który jest nam potrzebny żeby wyświetlić
tą ikonkę play czy na przykład te czasy i wstawiłem je tutaj na sztywno.
Dodatkowo do każdego takiego elementu,
który będzie nam potrzebny w języku JavaScript dodałem atrybut data-js i np.
timeline. Po co to zrobiłem?
Z tego powodu, że pokazywałem Ci w tym
kursie, iż możemy wyszukiwać na stronie elementów w najróżniejszy sposób np.
po klasie czy po identyfikatorze.
Teraz chcę Ci pokazać jeszcze inne podejście.
Na dowolnym elemencie HTML możemy dodać
sobie atrybut data pauza i tutaj cokolwiek tylko chcemy i jest to tzw.
własny atrybut.
Dlatego możemy dodać taki atrybut, ja to często czynię, jak data i następnie js np.
timeline.
To sugeruje, że ten atrybut jest tutaj potrzebny dlatego, że ten element będzie w
jakiś sposób wyszukiwany z poziomu kodu JavaScript.
Dzięki temu, że nie będziemy wyszukiwać po
klasie czy po jakimś identyfikatorze, gdyby nad tym kodem pracował i np.
designer i front-end developer, który tworzy ten player, to wtedy możemy umówić
się, że designer może dowolnie zmieniać wszystkie te klasy, dodawać inne itd.
i pisać je również w tym pliku
CSS natomiast ma całkowicie nie ruszać tych atrybutów dodanych przez nas.
Dzięki temu po tych atrybutach odwołamy
się do tego elementu i wszystko zawsze będzie działać.
Natomiast gdybyśmy go pobrali po klasie to
jeżeli ktoś później zmieni tą klasę to nasz kod przestanie działać.
A zatem to jest też dobry sposób, żeby pobierać sobie te elementy do JavaScript.
Tak jak wspomniałem to data pauza jest wymagane, a potem dowolna rzecz, którą
chcesz, więc ja podaję js, żeby powiedzieć, że w JavaScript się do tego
elementu będę odwoływał no i jego nazwę unikalną
jak widzisz za każdym razem tutaj jest inna.
To co będę chciał teraz zrobić, to pobrać
sobie wszystkie te elementy do zmiennych, żebyśmy mogli na nich pracować.
I tutaj znowu drogi są dwie,
bo moglibyśmy wszystkie te elementy utworzyć w sposób dynamiczny i wstrzyknąć
na stronę, ale nie chciałem na to tracić czasu.
Chcę Ci pokazać jak pracować z tym elementem video, a jeżeli uznasz, że
przygotowaliśmy fajne rozwiązanie, to będziesz mógł również przenieść logikę
tworzenia tych elementów do JavaScript właśnie po to, żeby ktoś kto korzysta z
tego playera nie musiał ich tutaj wstawiać w kodzie HTML, ale aby wywołał naszą
funkcję i aby one wszystkie utworzyły się same.
To co będziemy chcieli zrobić to stworzyć sobie funkcję, którą nazwiemy createPlayer
i chciałbym, żeby ta funkcja przyjmowała
kontener, czyli główny element, w którym znajdują się wszystkie pozostałe elementy.
I to będzie dokładnie ten element edu-player, któremu przypisaliśmy js-player.
A zatem nazwiemy sobie tutaj parametr container
i będziemy chcieli tę funkcję wywołać, żeby oczywiście uruchomić ten nasz player.
A zatem co chcemy tutaj przekazać jako kontener?
Ten element data-js-player.
Jak go wyszukać? Z użyciem document.querySelector
i po atrybutach możemy szukać w ten sposób.
A więc data-js-player,
czyli wywołaliśmy funkcję, przekazaliśmy tam odwołanie do tego elementu,
do tego pierwszego elementu i mamy go tutaj już w środku.
Zatem będziemy potrzebowali kilku takich stałych.
Po pierwsze chcę wyszukać sobie element
video, czyli ten element, ale jak widzisz szukam go właśnie w tym kontenerze.
Dzięki temu moglibyśmy na stronie mieć więcej takich playerów i wywołać tę
funkcję kilkukrotnie, przekazując tylko odpowiedni kontener.
Więc zapiszemy container.querySelector i wyszukamy tam bezpośrednio elementu video.
No i potrzebujemy jeszcze odwołanie do wszystkich pozostałych elementów takich
jak timeline, play, duration czy progress, bo każdy z nich będzie nam potrzebny.
A zatem ja je teraz wkleję.
Ty również możesz je znaleźć do skopiowania na linii czasu.
Tak to będzie wyglądać. Jak widzisz, nie ma tutaj zaskoczenia.
To co jest istotne to to, że wyszukujemy w
tym kontenerze przekazanym, a nie na całej stronie.
Zatem możemy na stronie mieć więcej elementów, które mają taką samą nazwę
tutaj w tym atrybucie, tylko musielibyśmy je zawrzeć w kolejnym takim
playerze.
I teraz to co będziemy chcieli zrobić na początek to po kliknięciu w przycisk Play,
który mamy właśnie tutaj i na stronie on wygląda tak,
będziemy chcieli zacząć odtwarzać to
wideo, a jeżeli ono będzie odtwarzane, to będziemy chcieli to wideo zatrzymać. I
zrobimy sobie to w takiej formie, że będziemy mieć tutaj kilka funkcji.
Będę chciał funkcję nazwać togglePlay
w ten sposób i następnie chcę ją przypisać do kliknięcia właśnie na ten element.
A więc tutaj nie będzie nic, czego byś do tej pory nie znał, czyli play.addEventListener
click i po kliknięciu chcemy wywołać funkcję togglePlay.
W ten oto sposób console.log tutaj napiszmy sobie play i sprawdzimy czy to działa.
Klikam na ten element, OK.
Jak widzisz otrzymaliśmy tutaj jakiś błąd.
Przyjrzyjmy mu się.
OK, widzę literówkę.
Tutaj zabrakło e. Spróbujmy jeszcze raz.
Odświeżyło się, naciskam i widzimy play.
No i teraz pytanie jak sprawdzić czy video
jest aktualnie odtwarzane, czy nie jest żeby go odtworzyć?
Otóż możemy się odwołać do tego elementu
video, który jest tutaj u góry i będzie to odwołanie do HTMLMediaElement.
Możesz to znaleźć w dokumentacji i tutaj są wszystkie właściwości z jakich możemy
korzystać na takim elemencie, a także metody, z których skorzystamy później.
Zatem zobaczmy. Mamy np.
metodę Play, ale mamy również atrybut czy
taką właściwość, która nas interesuje jak paused, gdzieś sobie tego wyszukam.
Dokładnie tutaj i to nam zwraca boolean true lub false.
Czy wideo jest zapauzowane czy nie.
A zatem po wywołaniu tej funkcji będę chciał zapytać jeżeli video.paused,
czyli jeżeli jest zapauzowane to chcę go odtworzyć pisząc po prostu video.play,
bo to jest ta metoda, która też w dokumentacji się znalazła, a w przeciwnym
wypadku jeżeli nie było zapauzowane, to chcę go zapauzować wpisując video.pause.
Zobacz jak bardzo proste to jest.
Z użyciem języka JavaScript komunikujemy
się z takim API przeglądarki dla elementu video, tak samo by to działało dla
elementu audio. No i zobaczmy jaki będzie tutaj efekt.
Wrócimy sobie tutaj, nacisnę play i pause.
Jak widzisz to wszystko się odtwarza i działa poprawnie.
Natomiast teraz chciałbym zadbać o to, żeby zmieniać jeszcze tę ikonkę.
Będzie to wyglądać tak, że mamy tutaj ten element i ma on taką kasę fa-play
jeżeli to zmienimy na fa-pause, zobacz to wtedy będzie to wyglądać następująco.
Więc dokładnie to będę chciał teraz zrobić i zrobimy to również w tej funkcji.
Więc odwołamy się do tego przycisku play.classList, no i jeżeli odtwarzamy to chcemy
usunąć klasę fa-play a następnie dodać klasę
fa-pause tak jak mówiłem.
A tutaj zrobimy rzecz odwrotną.
Czyli usuniemy fa-pause i dodamy fa-play.
OK, zobaczmy teraz.
Jak widzisz wszystko działa poprawnie.
Następną rzeczą, którą będę chciał zrobić
to będę chciał, żeby tutaj ładował się taki pasek.
Pokażę Ci jak on wygląda.
Mamy tutaj w środku taki element w tym timeline.
To jest ten progress. Jeżeli jemu przypiszemy width np.
30% to będzie to w ten sposób załadowane. I chciałbym teraz to wyliczyć.
Pokażę Ci jak to zrobić tutaj w konsoli.
Jeżeli zaznaczymy ten element video to możemy się do niego odwołać pod dolar 0.
Tak samo jak tutaj mamy w kodzie pobrany
ten element, czyli możemy na nim poeksperymentować.
I ma on taką właściwość jak currentTime
i ona nam zwraca w sekundach, ile tego
wideo zostało odtworzone, a także mamy taką właściwość jak duration,
czyli ile trwa całe to wideo.
Zatem jeżeli chcemy wyliczyć postęp, to
wystarczy, że sobie podzielimy to w ten sposób, że napiszemy
currentTime dzielone przez duration razy 100
i mamy 8%, prawie 9 i taką wartość
przypiszemy do width właśnie tego div. I to będzie się automatycznie zmieniać.
Natomiast musimy do tego celu przypisać pewne zdarzenie.
A zatem do elementów video przypiszemy,
zobacz, że możemy przypisywać zdarzenia nie tylko do jakiegoś elementu div
takim był elementem play, ale również do tego elementu video.
On również ma taką metodę jak addEventListener i przypiszemy tutaj zdarzenie,
które nazywa się timeupdate i ono się wywołuje za każdym razem, kiedy po prostu
to video jest odtwarzane i ten postęp trwa.
I tutaj będziemy chcieli wywołać funkcję,
którą utworzymy, którą nazwiemy updateProgress.
OK, no i teraz utwórzmy sobie taką funkcję.
Ona oczywiście otrzyma event i teraz możemy się albo odwołać do event.currentTarget
to nam zwróci video, bo na tym video to zdarzenie się wykonało.
Albo możemy się tutaj bezpośrednio odwoływać do video.
Ja się odwołam do event.currentTarget w ten sposób będzie to taka bardziej
dynamiczna funkcja, która niekoniecznie liczy na to, że w zakresie tej funkcji
również jest dostęp do jakiejś zmiennej z video. Po e.currentTarget zawsze będzie miała
dostęp do elementu, na którym się wywloało to zdarzenie.
No i będziemy chcieli tutaj wyliczyć ten progress
tak jak wspomniałem.
Czyli jeżeli currentTarget to jest video to będziemy mogli na nim się odwołać do
currentTime i podzielić to przez e.currentTarget.duration pomnożyć razy 100
i to wszystko będziemy chcieli przypisać
jako szerokość tego elementu, o którym wspomniałem.
Mamy go u góry w stałej zapisany jako progress, więc przypiszemy mu style.width
i w takim Template Stringu dokładnie to co wyciąłem to sobie wkleję.
Czyli to wszystko chcemy wyliczyć i
przypisać tutaj w formie procentów Ten procent na końcu jest bardzo ważny.
Zróbmy coś takiego no i sprawdźmy jak to będzie wyglądać.
Jak widzisz wszystko działa.
Ten pasek się tutaj ładuje, więc to
zdarzenie jest odpalane właśnie tak często jak widzimy postęp tego paska.
Pozostały nam do zrobienia jeszcze trzy rzeczy.
Chciałbym móc kliknąć w dowolnym miejscu i
przewinąć, a także chciałbym tutaj wyświetlać aktualny czas, czyli postęp, a
tutaj całkowity czas, czyli to duration i tym zajmiemy się w lekcji kolejnej.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement
Zmienne · 5 min
const timeline = container.querySelector("[data-js-timeline]");
const play = container.querySelector("[data-js-play]");
const time = container.querySelector("[data-js-time]");
const duration = container.querySelector("[data-js-duration]");
const progress = container.querySelector("[data-js-progress]");