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 powiemy sobie o globalnym obiekcie
w języku JavaScript, którym w przypadku przeglądarki jest obiekt window.
Jak już wspominałem wcześniej, jeżeli chodzi o środowisko, w którym język
JavaScript jest uruchamiany, to ono może być różne.
Może to być np. Node.js, albo może to być środowisko
przeglądarki internetowej, w którym jesteśmy teraz.
Niemniej jednak sama specyfikacja języka JavaScript mówi o tym, że zawsze jest tam
pewnego rodzaju globalny obiekt, tak jakby najwyższy w hierarchii obiekt, na którym
mogą znajdować się pewne inne obiekty czy dostępne informacje.
I jeżeli chodzi o Node.js, to ten obiekt
nazywa się Global i mamy po prostu jakby taką zmienną, która się tak nazywa
a w przypadku przeglądarki internetowej ten obiekt nazywa się window.
Więc jeżeli teraz od razu w konsoli
wpiszę sobie window, zauważ, że to nam zwraca odwołanie do
jakiegoś obiektu, w którym jest masa rzeczy.
I teraz te rzeczy mogą się różnić w
różnych przeglądarkach internetowych, dlatego, że one nie są tutaj jakby z samej
specyfikacji języka JavaScript stworzone, tylko z tego, co oferuje przeglądarka.
Niemniej jednak chodzi o to, że jest jakiś obiekt dostępny pod taką jakby zmienną o
nazwie window i na nim mamy różne właściwości i metody.
Co oznacza to, że jest to obiekt globalny?
Otóż, że jest to jakby najwyższy w hierarchii
obiekt i będzie on dostępny po prostu wszędzie.
Jeżeli przejdziemy sobie do naszego skryptu, nigdzie nie otworzyliśmy tutaj jak widzisz ani
stałej, ani żadnej zmiennej o nazwie window, a mimo tego mamy dostęp do takiego
obiektu window i na nim możemy do różnych rzeczy się odwoływać.
Co jeszcze jest bardzo ważne, jeżeli sobie
utworzymy jakąś funkcję w globalnym zakresie,
czyli jesteśmy teraz w pliku main.js,
który jest podpięty do strony i nie będziemy tego oplatać żadną funkcją, która nam
ograniczy zakres, to jeżeli utworzę jakąś funkcję, nazwalibyśmy ją np.
myFn.
Ona nie musi nic robić.
Jeżeli to zapiszę, to taka funkcja czytaj
nazwa automatycznie staje się właściwością obiektu globalnego.
Czyli jeżeli teraz bym się tutaj odwołał do myFn, wiadomo, że ona tutaj będzie,
ale jeśli się odwołam do window.myFn
zauważ, że taka właściwość na obiekcie window się znalazła
mimo tego, że ja nigdzie nie napisałem,
że chcę do window.myFn przypisać odwołanie do właśnie tej funkcji.
Więc warto o tym wiedzieć.
I podobnie jest, gdybyśmy w starym zapisie z użyciem var tworzyli jakieś zmienne.
Gdybym napisał sobie tutaj np.
firstName, przypisał tutaj jakąkolwiek
wartość, to też stałoby się to właściwością obiektu window.
Natomiast jeżeli utworzymy zmienną lub
stałą z użyciem let lub const, to ona owszem zobacz będzie dostępna globalnie, bo nie
ograniczyliśmy tutaj tego zakresu, więc firstName jest dostępne, ale nie jest
wtedy dostępne na window, czyli nie staje się właściwością tego oto obiektu.
Natomiast w przypadku funkcji tak jest, ale
zazwyczaj ten nasz kod będzie w jakiś sposób w modułach
też pakowany tak, że nie będzie po prostu takich globalnych funkcji.
Niemniej jednak warto o tym wiedzieć.
Co zatem kryje się za tym obiektem window w przeglądarkach?
Co na nim możemy ciekawego znaleźć?
Na nim mamy różne inne obiekty, do których można się jednak odwoływać bezpośrednio.
Na przykład coś takiego jak document, z czego będziemy jeszcze korzystać, czy np.
location. Można z tego skorzystać bezpośrednio,
ale można również z tego skorzystać, co ja często czynię poprzez window.location.
Jest to dla mnie bardziej czytelne, czy np.
window.localStorage. To jest takie API, które pozwala nam przechowywać jakieś dane
tekstowe w przeglądarce pomiędzy przeładowywaniami stron.
Jest to dostępne również bez tego window,
bo jeżeli coś jest właściwością obiektu window, to jest automatycznie dostępne
wszędzie właśnie bez poprzedzenia tego przez window,
no ale właśnie na tym obiekcie window bardzo wiele rzeczy się znajduje
i jeżeli go sobie tutaj wyświetlimy, to wszystkie z nich mógłbyś tutaj znaleźć.
Niemniej jednak niech to Cię nie
przytłoczy, bo nie są to rzeczy ani które trzeba znać na pamięć, ani które mają
jakieś wielkie znaczenie w większości przypadków.
Innymi słowy są to rzeczy, po które z czasem będziesz sięgał.
Będziemy również w tym kursie część z nich omawiać,
no i warto wiedzieć, że one jeżeli są
globalne, to znaczy, że są właściwością na obiekcie window.
Skoro ten obiekt window jest globalny, to
można go jeszcze w ciekawy sposób wykorzystać.
Jeżeli sobie przejdziemy tutaj do index.
html to pokażę Ci, że możemy sobie tutaj wstawić taki skrypt liniowy, który będzie tak
wyglądał i do obiektu window przypisać sobie jakąś własną właściwość.
To jest coś, co ja bardzo często czynię,
jeżeli chcę tutaj w tym miejscu zdefiniować pewne dane, do których będę
miał dostęp ze wszystkich podłączonych niżej skryptów.
Więc możemy np. napisać window.USER
ja sobie lubię to tak wielkimi literami
zapisać i przypisać sobie tutaj taki oto obiekt, którym zapisze jakieś dane np.
name miałbym tutaj Jan i powiedzmy email mielibyśmy jan@example.com.
Teraz o co chodzi?
Tych danych raczej bym tutaj nie wpisywał ręcznie, tylko one byłyby tutaj wstawione
poprzez jakiś dynamiczny język back-endowy.
Na przykład gdyby ten plik index.
html był plikiem php
w języku php. Byłby to index.php
po prostu, to mógłbym tutaj wczytując ten
szablon wyciągnąć jakieś dane z bazy danych np.
o aktualnie zalogowanym użytkowniku i tutaj sobie je wstawić.
Jeżeli miałeś do czynienia z językiem PHP
to być może wiesz, że moglibyśmy wtedy tutaj zrobić coś takiego php echo i np.
mielibyśmy coś takiego jak user name.
Mogłoby to tak wyglądać
i to by oznaczało, że kiedy ta strona na
serwerze jest renderowana to tutaj po prostu zostanie wstawione np.
Jan. I kiedy coś takiego trafi do przeglądarki
czyli taki kod to w każdym skrypcie, który podpieliśmy poniżej będziemy mieli dostęp
właśnie do takiej globalnej zmiennej user i będziemy sobie mogli te rzeczy odczytać.
Czyli teraz jak przejdziemy do main to po
pierwsze mógłbym się tutaj odwołać po prostu do user tak globalnie
i wtedy mielibyśmy tam name albo co ja
zazwyczaj czynię odwołuję się poprzez window.
Jest to dla mnie jakby znakiem, że to jest przypisane do obiektu globalnego.
Czyli moglibyśmy zrobić console.log window.USER i np.
name. Zobaczmy.
Oczywiście wyświetli nam się Jan. Więc ten globalny obiekt może być wykorzystywany do
tego, żeby właśnie coś było przypisane globalnie i dostępne wszędzie.
No i może to też działać w drugą stronę.
To znaczy z Twoich skryptów mógłbyś sobie tutaj utworzyć jakąś funkcję,
ona by mogła być w jakiś modułach, jeszcze zawarta itd.
i powiedzmy tak jak wcześniej pokazałem, byłaby to jakaś funkcja myFn i w dowolnym
momencie mógłbyś ją przypisać do window albo pod taką samą nazwą myFn, albo pod inną
nazwą i dzięki temu, że Ty ją w ten sposób przypiszesz do globalnego obiektu, to ona
będzie dostępna we wszystkich innych skryptach, które by się znalazły poniżej
tego skryptu, albo oczywiście w kodzie, który znajdzie się tutaj poniżej.
Na koniec powiem Ci jeszcze, że tak jak
wspomniałem na początku, w przypadku Node.js tam nie ma obiektu window, bo on jest
specyficzny dla przeglądarki i na nim są tutaj różne rzeczy związane z
przeglądarką, ale także przy okazji on jest obiektem globalnym,
w przypadku Node.js mamy taką zmienną,
która się nazywa global i ona się odwołuje do globalnego obiektu.
Ale jakiś czas temu specyfikacja języka JavaScript wdrożyła coś takiego
czy stworzyła taki zapis, aby w każdym środowisku, które wykonuje kod JavaScript
była taka globalna zmienna, która się nazywa globalThis. I to globalThis
jeżeli sobie porównamy tym operatorem Strict Equality Operator do Window
zwróci nam true, a to oznacza, że globalThis jeśli z tego skorzystamy to jest
dokładnie to samo co window, a w przypadku Node.js globalThis
to będzie dokładnie to samo co stała global, o której wspomniałem.
I teraz czy musisz z tego korzystać?
Jak najbardziej nie i prawdopodobnie to Ci
się nie przyda, ale to jest po to, żebyśmy mogli napisać kod JavaScript nie myśląc
czy on będzie uruchamiany w przeglądarce czy np.
w Node.js i wtedy się nie zastanawiamy czy
korzystamy z Window czy z Global, tylko po prostu skorzystamy z globalThis i taki kod
niezależnie gdzie będzie uruchomiony będzie działał tak samo.
Oczywiście w takim kodzie nie moglibyśmy
korzystać z rzeczy specyficznych dla środowiska przeglądarki internetowej czy
specyficznych dla Node. Ale gdybyśmy tam wykorzystali tylko taki generyczny kod
JavaScript, to tam możemy skorzystać właśnie z globalThis i
będzie to wtedy działać i w jednym, i w drugim środowisku dokładnie tak samo.
To zatem tyle, jeżeli chodzi o window.
Oczywiście będziemy sięgać po wiele z
rzeczy, które na tym obiekcie w przeglądarce są dostępne
i już w kolejnej lekcji pokażę Ci jeszcze
kilka obiektów, które są jeden poziom niżej, czyli właśnie są przypisane do
window, które mogą się w wielu sytuacjach przydać.