od Podstaw
10 godz. 55 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperJeśli poznałeś już wymienione wyżej technologie, to zapewne zdajesz sobie sprawę z ich ograniczeń. Za pomocą języka HTML tworzymy bowiem strukturę dokumentu, dodajemy treść tekstową, obrazy czy wideo. Aby jednak strona internetowa wyglądała perfekcyjnie, korzystamy z arkuszy stylów CSS, które pozwalają nam opisać wygląd wszystkich elementów HTML, ustawić wielkość tekstu czy dodać tło strony. No właśnie, ale gdzie tutaj interakcyjność?Zapewne już wiesz, że język CSS oferuje tzw. pseudoklasy, które pozwalają nam np. przypisać zmianę koloru elementu po najechaniu na niego kursorem myszy. I to tak naprawdę wszystko, na co możemy zareagować. A co gdybyśmy chcieli po wciśnięciu jakiegoś przycisku wysunąć ukryty panel, sprawdzić poprawność wypełnianego właśnie formularza lub pobrać dane z serwera i wyświetlić je na stronie bez przeładowywania witryny? Dobra wiadomość jest taka, że to wszystko jest możliwe z użyciem języka JavaScript, który “rozumie” każda przeglądarka internetowa.Choć język JavaScript powstał jako język skryptowy na potrzeby stron internetowych, to już dawno temu “wyszedł” z przeglądarek internetowych i może być używany tak naprawdę gdziekolwiek. W kursie, który masz przed sobą, poznasz język JavaScript jako niezależny język programowania, a dopiero później dowiesz się, jak wykorzystywać go do wzbogacania stron internetowych. Dzięki postawieniu grubej linii pomiędzy samym językiem, a Obiektowym Modelem Dokumentu dostępnym w przeglądarkach internetowych, będziesz nie tylko bardzo dobrze rozumiał sam język, ale w przyszłości wykorzystasz go do innych zastosowań.Na początku omówimy ciekawą historię języka JavaScript, a chwilę później rozpoczniemy poznawanie najważniejszych jego konstrukcji. I tak dowiesz się czym są zmienne, jakie typy danych dostępne są w tym języku, czym są liczne operatory, instrukcje warunkowe, pętle, tablice, obiekty i funkcje. Wszystkie te zagadnienia są bardzo podobne w innych językach programowania, dlatego kurs ten jest również świetnym wstępem do programowania w ogóle. Każda z przedstawianych konstrukcji języka jest bardzo dokładnie tłumaczona z myślą osobach początkujących. Nie zmienia to jednak faktu, że nawet osoby znające już podstawy języka JavaScript znajdą tutaj coś dla siebie, gdyż na każdym etapie przedstawiane są również liczne ciekawostki odnośnie danej konstrukcji.Kiedy zrozumiesz już jak działa język JavaScript, przejdziemy do drugiej połowy kursu, gdzie dokładnie omówimy Obiektowy Model Dokumentu, dostępny w przeglądarkach internetowych. Zobaczysz jak przeglądarka tworzy z kodu HTML drzewo dokumentu, jak reprezentowane są poszczególne jego węzły, a także jak język JavaScript potrafi z tym “wewnętrznym światem” współpracować. Dowiesz się jak wyszukiwać na stronie interesujących nas elementów HTML, a także jak tworzyć nowe elementy, przypisywać im treść i wstawiać je na stronę. Popracujemy również z atrybutami elementów, ich klasami i wreszcie ze stylami CSS, abyśmy mogli wpływać dynamicznie na wygląd naszej strony.Zobaczysz również, jak możemy w dowolnym momencie odczytać współrzędne położenia elementu na stronie, a także jego wysokość czy szerokość. Tę wiedzę wykorzystamy później w praktycznym przykładzie.Jeden z rozdziałów kursu poświęcony został zdarzeniom, a więc możliwości reagowania na zachowania użytkownika. Dzięki temu zobaczysz, jak możemy przypisać np. zdarzenie kliknięcia do wybranego elementu, a kiedy zostanie on kliknięty, wykona się przygotowany przez nas kod. Poznasz kilka różnych sposobów na przypisywanie oraz usuwanie zdarzeń, a także dowiesz się czym jest tzw. “bubbling” oraz “capturing” czy jak zablokować domyślną akcję przeglądarki.Przy pisaniu jakiegokolwiek kodu, zawsze pojawiają się błędy, dlatego i tutaj Twoje wątpliwości nie pozostaną bez odpowiedzi. Poznasz wszystkie typu błędów, które mogą się pojawić podczas wykonywania naszego kodu, a także wiele sposobów ich wykrycia i wyeliminowania.W kursie nie brakuje oczywiście praktycznych przykładów, które celowo zostały ułożone tak, aby wykorzystać w nich jak najwięcej zdobytej wcześniej wiedzy. Nie zostaniesz więc sam z poczuciem, że co prawda rozumiesz jak działa dana konstrukcja, ale nie masz pomysłu, kiedy z niej skorzystać. Na początek wykonamy praktyczny projekt losowania liczb z wybranego przedziału tak, aby nie mogły się powtórzyć. Już przy tym projekcie poznasz wiele ciekawych technik i sztuczek.Następnie przejdziemy do nieco bardziej zaawansowanego przykładu i napiszemy skrypt, który pozwoli nam sortować dane w tabeli po wybranych kolumnach, kiedy któraś z nich zostanie kliknięta. Zobaczysz jak sortować dane zarówno malejąco jak i rosnąco, a także jak zmieniać kolejność elementów HTML na stronie.W kolejnym projekcie zajmiemy się walidacją danych wpisywanych do formularza, by ten nie mógł zostać wysłany do serwera tak długo, jak zawiera jakiekolwiek błędy. Zobaczysz tutaj zdarzenia związane z polami formularza, a także sposoby na pobieranie z nich wartości i sprawdzanie czy są one poprawne. Zadbamy także o wrażenia użytkownika i wyświetlimy na stronie stosowne błędy, a także podświetlimy źle uzupełnione pola na czerwono.W przedostatnim projekcie wstawimy na stronę przycisk, który będzie się pojawiał po przewinięciu strony w dół, a znikał po odwrotnej akcji. Co jednak ciekawe, po jego kliknięciu, strona zostanie automatycznie, płynnie przewinięta do samej góry.W ostatnim projekcie stworzymy bardzo efektowny dymek z podpowiedzią, który będzie się pojawiał nad elementem po najechaniu na niego kursorem myszy. Wykorzystamy tutaj mnóstwo ciekawych technik. Dowiesz się również jak swój kod przygotować w taki sposób, abyś mógł go udostępnić innym osobom, by w łatwy sposób skorzystały z przygotowanego Tooltipa na swoich stronach.Kurs kończy się sekcją Tips & Tricks, w której znajdziesz 10 krótkich lekcji. W każdej z nich została omówiona jedna sztuczka. Każda z nich pozwoli Ci jeszcze lepiej zrozumieć język JavaScript, ale przede wszystkim zaoszczędzić czas i kilka linijek często niepotrzebnego kodu.Podsumowując, kurs ten jest nie tylko wprowadzeniem do samego języka JavaScript, ale także do Obiektowego Modelu Dokumentu. Dzięki wyraźnemu rozdzieleniu tych dwóch zagadnień, będziesz mógł w przyszłości wykorzystać język JavaScript także do innych zastosowań, poza przeglądarką internetową.
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 czy programowania nie jest wymagana, gdyż wszystkie konstrukcje są starannie tłumaczone. 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, z kursem JavaScript w Praktyce, który powstał jako dopełnienie tego kursu i porusza nieco bardziej zaawansowane tematy, na które tutaj zabrakło już czasu.
W tej lekcji pokażę ci w jaki sposób utworzyć fragment dokumentu.
Co to takiego jest i dlaczego jest bardzo przydatne w obiektowym modelu dokumentu.
Przejdziemy od razu do kodu i w HTML'u
chcę Ci pokazać że mamy ul z identyfikatorem list i kilka elementów
li, od sobie pobrałem referencje do tego obiektu.
Tutaj do list, tym razem poprzez metodę
getElementById,
żeby ci przypomnieć, że taka metoda istnieje
podajemy tutaj list i to właśnie id i teraz będę chciał wykonać pętle for. Jak pętle działają już ci
w tym kursie
tłumaczyłem, więc szybko ją napiszę.
Myślę, że widzisz, co ta pętla będzie robić.
Otóż 5 obrotów, czyli od zera do pięciu będziemy chcieli wykonać i stworzyć kilka elementów. I w tej pętli
będę chciał tworzyć nowe elementy li stawiać je tutaj,
do tego elementu, nie ma problemu,
5 takich elementów powinno zostać utworzonych, więc możemy zacząć. Na początek, żeby stworzyć element wiesz,
że możemy napisać var li
i document.createElement, li,
czyli utworzyliśmy sobie nowy element.
Teraz będę chciał do niego wstawić jakiś text, więc możemy to zrobić poprzez li.appendChild
i tutaj pamiętasz, że mogliśmy otworzyć poprzez dokcument.createTextNode na przykład napis "Nowy element listy".
Chciałbym, żeby tutaj było dodane również numerek, czyli na początku i ma wartość 0, potem 1 itd.
Więc dodajmy sobie to tutaj czyli + i mam nadzieję, że na tym etapie to wszystko łapiesz, że kolejność wykonywania
tych wyrażeń tutaj to zostanie najpierw do siebie dodane zostanie to przekazane do metody
createTextNode.
Cała ta metoda zwróci nam nowy element tekstowy, który można poprzez appendChild wstawić do li.
No i na koniec będę chciał to li wstawić na stronę, czyli do list a więc odwołam się do list.appendChild
li.
Nie powinno być problemu przejdźmy na stronę.
Zobaczmy.
Nowy element listy 0 1 2 3 4 5.
Teraz chcę ci powiedzieć jaki tutaj się pojawił problem.
Chociaż po odświeżaniu, jak widzisz błyskawicznie to wszystko działa.
Otóż za każdym razem w tej pętli odwoływaliśmy się do listy i wystawialiśmy do niej kolejne elementy li,
czyli przeglądarka tak naprawdę za każdym razem musiała od nowa renderować widok, bo przeglądarka
to wszystko, co tutaj nam pokazuje.
Tak naprawdę musi wyrenderować, to są po prostu piksele, które my tutaj widzimy.
Nawet takie zaznaczanie tekstu, to dla przeglądarki jest jakaś praca, aby to podświetlić itd.
Jeżeli zatem dodajemy nowe elementy do takiej listy czy w ogóle na stronę to przeglądarka musi wyliczyć
geometrie.
Musi je tutaj dodać, gdyby pod spodem był jakiś inny element w to wiesz, że on się przesunie w dół z tego powodu,
że te elementy są wyżej i tak dalej i nie jest najefektywniejszy i nie jest uznawane za dobrą praktykę.
Bardzo często, szczególnie właśnie w pętlach, dodawać nowe elementy do DOM'u, czyli do obiektowego modelu
dokumentu.
Byłoby dużo fajniej, gdybyśmy mogli tutaj dodać w pętli wszystkie te elementy do jakiegoś fragmentu, a
potem jednorazowo ten fragment dodać na stronę.
No i okazuje się, że nie ma problemu możemy to zrobić.
Do tego właśnie służy fragment dokumentu, który chciałbym Ci przedstawić.
Tworzymy go za pomocą document.createDocumentFragment, natomiast musimy go zapisać w jakiejś zmiennej
więc ja o nazwę dc, jak document fragment i document.createDokumentFragment.
W ten sposób i on zachowuje się jak element, taki właśnie HTML, do którego można różne rzeczy dodawać.
Ale nie jest ani div'em, ani elementem span, nie jest żadnym konkretnym elementem.
I teraz jeżeli byśmy sobie taką pętlę skopiowali, tutaj poniżej. Odkomentuje ją, aby działała, to zamiast
dodawać te wszystkie elementy na stronę.
To ja je dodam do document fragment, czyli taki document fragment posiada wszystkie te metody, które inne
elementy, czyli ma również metodę appendChild i za każdą iteracją tej pętli będziemy nowe li do niego
dodawać.
I dlaczego to jest efektywne?
Zobacz, na stronie te elementy nigdzie się nie pojawiają.
One są tylko w pamięci i po przeiterowaniu tej pętli przez wszystkie te jej obroty tak zwane. W tym elemencie
dc. Możemy tak naprawdę sprawdzić, co się znajduje.
Jest to document fragment, który ma w sobie jak widzisz kilka nowych elementów i co jest bardzo ciekawe
to taki document fragment możemy na stronę wstawić
np. w tym miejscu list.appendChild i napiszemy dc, czyli w tym momencie wstawiamy taki document fragment,
możesz myśleć o nim jako takim div'ie, do którego wrzuciliśmy te li, ale sam ten fragment nie jest wrzucony,
ale wszystkie elementy, które w nim były czyli właśnie te li.
I jeżeli odświeżę, to wszystkie te elementy się tutaj pojawiły.
Ale z punktu widzenia dobrych praktyk zrobiliśmy to lepiej, bo one jednorazowo zostały tutaj dodane, przeglądarka
raz musiała to wszystko wyrenderować, a nie tyle razy ile obrotów pętli jak robiliśmy to tutaj.
Mam nadzieję że załapałeś o co chodzi w tworzeniu nowych fragmentów dokumentów.
Za każdym razem kiedy wiele elementów pętli będziesz musiał utworzyć, żeby je potem wstawić na stronę.
Stwórz sobie nowy fragment dokumentu.
Tak będzie najefektywniej.
Tworzenie fragmentu dokumentu · 1 min
var list = document.getElementById("list");
// for(var i = 0; i <= 5; i++) {
// var li = document.createElement("li");
// li.appendChild(document.createTextNode("Nowy element listy " + i));
// list.appendChild(li);
// }
var dc = document.createDocumentFragment();
for(var i = 0; i <= 5; i++) {
var li = document.createElement("li");
li.appendChild(document.createTextNode("Nowy element listy " + i));
dc.appendChild(li);
}
list.appendChild(dc);