jQuery

jQuery - biblioteka która zrobiła niemałe zamieszanie w internecie.

Swoją popularność zawdzięcza kilku rzeczom, które ją charakteryzują.

Po pierwsze jQuery bardzo upraszcza pisanie skryptów. Dzięki niej zamiast skupiać się jak napisać dany fragment kodu, skupiamy się na tym jak rozwiązać dany problem.

Druga bardzo ważna sprawa to olbrzymie! zaplecze gotowych pluginów. Chcesz użyć lightboxa na stronie? Dorzucasz plugin, dopisujesz 2-3 linijki kodu i masz lightbox. Chcesz użyć na stronie responsywnej karuzeli? Znowu - zastosujesz odpowiedni plugin, napiszesz kilka linii kodu i problem rozwiązany. Nawet w dzisiejszych czasach na próżno będziemy szukać podobnych rozwiązań w nowoczesnych frameworkach (React/Angular) czy czystym JavaScript. A nawet jeżeli cokolwiek znajdziemy, rozwiązania te nie będą tak dopracowane jak ich odpowiedniki z jQuery. Może wynika to właśnie z tego co napisałem na początku? Autorzy skupiali się na funkcjonalności, a nie jak pisać kod...

Kolejną zaletą - w dzisiejszych czasach może mniej znaczącą - jest jednolitość kodu. Gdy jQuery wchodziła na rynek wciąż istniała na rynku spora rozbieżność w implementacji różnych "ficzerów" (i istnieje po dzień dzisiejszy - ot chociażby pierwsze z brzegu). Dla przykładu - event DOMContentLoaded nie był wspierany przez wszystkie przeglądarki i najbezpieczniejszym rozwiązaniem było zastosować odpowiedni kod jQuery. W dzisiejszych czasach JavaScript dołącza do swojej specyfikacji coraz więcej rozwiązań znanych z jQuery. Obietnice, closest(), after(), before(), prepend(), append() itp. to rzeczy, które już dawno istniały w jQuery - i to działały we wszystkich przeglądarkach, a wiele z nich działało lepiej niż ich odpowiedniki z czystego Javascript. A w jQuery jest tego o wiele, wiele więcej...

Czy w dzisiejszych czasach warto uczyć się jQuery? Jeżeli interesuje cie zdanie autora, zapraszam do mini lektury. W przeciwnym razie przechodzimy do nauki - bo warto!

Rozpoczęcie pracy

Aby zacząć używać jQuery, będziemy musieli dołączyć plik z tą biblioteką do naszej strony. Możemy albo ściągnąć plik z biblioteką na dysk, albo odwołać się do wystawionej w necie wersji. Najlepiej skorzystać z serwera CDN jQuery (lub innego np. https://cdnjs.com/). Wystarczy wstawić taką ścieżkę przed nasze skrypty po czym można zacząć pisać kod.

Ja osobiście lubię odwoływać się do serwerów CDN Googla wstawiając do html link ze strony https://developers.google.com/speed/libraries/#jquery.

Jeżeli używasz webstorma i chcesz korzystać z wersji CDN, polecam dodać ją do globalnej biblioteki, dzięki czemu edytor ten będzie lepiej podpowiadać składnię.

Dokumentacja

Przy nauce jQuery warto korzystać z oficjalnej dokumentacji, która jest pod adresem https://api.jquery.com/

Bardzo pomocna będzie też alternatywna dokumentacja znajdująca się pod adresem http://jqapi.com/

document ready

Tak samo jak w przypadku czystego JavaScript aby pobierać elementy ze strony, powinniśmy się upewnić, że drzewo DOM zostało już wczytane) korzystając z eventu DOMContentLoaded. jQuery upraszcza jego zapis:

Pobieranie elementów

Do tej pory aby pobrać elementy ze strony głównie używaliśmy funkcji querySelector i querySelectorAll w zależności od tego, czy chcieliśmy pobrać jeden czy wiele elementów. Do każdej takiej funkcji musieliśmy przekazać odpowiedni selektor CSS, którym wyłapywaliśmy odpowiednie elementy.

W jQuery podobne zadanie wykonujemy za pomocą skróconej składni dolara:

Podając selektory w nawiasach możemy tutaj skorzystać z dodatkowych selektorów, które udostępnia nam jQuery:

:visible :hidden

Czy element jest widoczny/ukryty

:animated

Czy element jest aktualnie animowany

:text :submit :reset :checkbox :radio

Czy element jest kontrolką danego typu

:odd :even

czy element jest parzysty lub nieparzysty

gt(index) lt(index)

Wybierz elementy większe od lub mniejsze od danej liczby liczonej od 0

:header

Pobiera nagłówki np. h3

jQuery udostępnia nam też sporo dodatkowych funkcji, których niestety brakuje w czystym Javascript. Wśród nich najczęściej używanymi są:

wyszukuje wewnątrz danego elementu inne elementy podany w selektorze

zwraca z kolekcji element o danym indeksie

zwraca pierwszy element z kolekcji elementów. Selektor pozwala wskazać, że chodzi o pierwszy element, który równoecześnie pasuje do selektora

zwraca ostatni element z kolekcji elementów. Podobnie do powyższego selektor pozwala wskazać, że chodzi o ostatni element, który równocześnie pasuje do selektora

zwraca dany element, jeżeli nie pasuje on do selektora

zwraca dany element, jeżeli pasuje on do selektora

filtruje listę elementów przez zadane kryterium

dodaje do kolekcji inne elementy lub kolekcje

Jeżeli chcesz się dowiedzieć więcej na temat selektorów jquery, odwiedź stronę http://jqapi.com/#p=class-selector po czym przejść do zakładki Selectors (okazyjnie przeglądając i inne zakładki).

Poza wyżej wymienionymi metodami jQuery udostępnia nam też funkcje służące do poruszania się po drzewie DOM:

Pobiera rodzica. Parametr selektor jest opcjonalny. Jeżeli go nie podamy, zostanie pobrany dowolny rodzic elementu. Jeżeli go podamy, zostanie pobrany rodzic pasujący do selektora.

idzie w górę drzewa, aż natrafi na rodzica który pasuje do selektora

idzie w górę drzewa, aż natrafi na rodzica który pasuje do selektora

pobiera braci elementu. Jeżeli podamy selektor, zwróci braci, którzy pasują do selektora

pobiera następny element jeżeli pasuje do selektora. Można też pominąć ten parametr, wtedy pobierze dowolny następny element

Pobiera wszystkie następne elementy dopóki nie natrafi na element pasujący do selektora. Jeżeli nie podamy selektora, wszystkie następne elementy zostaną zwrócone

pobiera poprzedni element jeżeli pasuje do selektora. Można też pominąć ten parametr, wtedy pobierze dowolny poprzedni element

Pobiera wszystkie poprzednie elementy dopóki nie natrafi na element pasujący do selektora. Jeżeli nie podamy selektora, wszystkie poprzednie elementy zostaną zwrócone

pobiera bezpośrednie dzieci elementu. Jeżeli podamy selektor, zwróci dzieci tylko pasujące do selektora.

Na szczególną uwagę zasługują metody parents() i closest().

Metoda parents() zwraca pierwszego napotkanego rodzica, który pasuje do podanego selektora. Sprawdzanie takie rozpoczyna się od rodzica danego elementu (czyli nigdy nie zostanie zwrócony element, na którym została wywołana ta metoda). Metoda closest() działa całkiem podobnie, ale rozpoczyna swoją podróż z uwzględnieniem danego elementu:

Zauważ, że w powyższych listingach gdy pobierałem pod zmienną jakiś element za pomocą jQuery, zmienną taką nazywałem od znaku $. To tylko konwencja, ułatwienie, które podpowiada mi, że dla takiej zmiennej mogę potem użyć metod jQuery:

Jeżeli chcesz używać tej konwencji, pamiętaj, że zmienne zaczynamy od dolara tylko wtedy, gdy zawierają element pobrany za pomocą jQuery:

Manipulacja stylami i klasami

Po pobraniu elementu (lub stworzeniu) dostajemy dostęp do jego licznych właściwości i metod. Możemy tutaj oczywiście wykonywać podobne czynności co w czystym Javascript. Różnicą jest to, że jQuery w wielu momentach je ułatwia i poprawia niektóre bolączki z czystego Javascript.

Aby zmienić style elementu skorzystamy z metody css(właściwość, nowa_wartość*), którą można używać na różne sposoby:

W zwykłym Javascript jeżeli pobierzemy wiele elementów, aby dodać style, musimy zrobić po nich pętlę. W przypadku jQuery w tym jak i w wielu innych przypadkach nie ma znaczenia, czy pobraliśmy jeden czy wiele elementów.

Dodatkowo dzięki tej samej metodzie możemy pobierać style elementu. W zwykłym Javascript za pomocą właściwości style możemy pobierać tylko style inline danego elementu, natomiast jQuery w razie potrzeby automatycznie zwróci nam style przeliczone.

Poza ustawianiem stylowania mamy też możliwość manipulowania klasami danego elementu. Podobnie do powyższego - nie ma tutaj znaczenia, czy w kolekcji znajduje się jeden, czy wiele elementów:

Wybrane metody i właściwości

jQuery udostępniam nam wiele naprawdę przydatnych metod. Poniżej lista tych najczęściej używanych:

pobiera lub ustawia atrybut o danej nazwie. Jeżeli atrybutu nie ma, zwraca undefined

usuwa atrybut o danej nazwie

pobiera lub ustawia daną właściwość. Jeżeli właściwości nie ma, zwraca undefined

usuwa daną właściwość

pobiera lub ustawia tekst elementu (równoznaczne z textContent).

pobiera lub ustawia html elementu (równoznaczne z innerHTML)

Ustawia lub pobiera wartość value

Zdarzenia w jquery

Aby przypiąć nasłuch zdarzenia do pobranego lub utworzonego elementu korzystamy z metody będącej nazwą zdarzenia, lub skorzystać z metody on().

Podobnie jak przy metodzie .css() i .attr() także przy zdarzeniach możemy je deklarować pojedynczo, ale i zbiorczo podając obiekt z odpowiednimi kluczami:

Przy czym znacznie częściej spotkasz pierwszy zapis.

Aby odwołać się do obiektu wywołującego, wskazujemy go identycznie jak w przypadku klasycznego Javascript czyli poprzez this, e.target lub e.currentTarget.

Zauważ, jak objęliśmy nasze zmienne składnią dolara.

Jeżeli dana zmienna zawiera odwołanie do jakiegoś elementu (np. window, e.target, this itp.), możemy na takich elementach wykonywać metody i właściwości z czystego Javascript.

Aby na takim obiekcie wykonywać operacje jQuerowe (np. find(), parent(), css()), wystarczy takie elementy objąć nawiasami:

Aby odpiąć dane zdarzenie, skorzystamy z metody off(). Działa ona praktycznie tak samo jak removeEventListener, czyli jeżeli chcemy odpiąć jakąś funkcję, powinniśmy przekazać ją jako parametr:

W jQuery w przeciwieństwie do JavaScript możemy też odpinać funkcje anonimowe. Wystarczy przy ich podpinaniu podać dla zdarzenia nazwę:

Jeżeli chcemy do elementu podpiąć event, który wykona się tylko jeden raz (a zaraz potem zostanie usunięty), skorzystamy z funkcji .one():

Jest to równoznaczne z odpisaniem eventu z jego wnętrza (co jest możliwe także tylko w Jquery):

Pokazywanie i ukrywanie elementów

jQuery udostępnia nam kilka metod służących do pokazywania i ukrywania elementów na stronie.

Pierwszymi z nich są show() która pokazuje i hide() która ukrywa dany element.

Powyższy kod nie do końca jest równoznaczny z ręcznym ustawianiem display:

Element może mieć różne stylowanie i wcale nie jest powiedziane, że będzie miał właściwość display ustawioną na block.

Powyższe metody automatycznie określają jakie wyświetlanie ma dany element.

Płynne pokazywanie i ukrywanie elementów

Aby płynnie pokazywać lub ukrywać elementy, skorzystamy z metod:

Nazwa metody
Co robi

$el.fadeIn(szybkosc*, funkcjaZwrotna*)

płynnie pokazuje element

$el.fadeOut(szybkosc*, funkcjaZwrotna*)

płynnie ukrywa element

$el.fadeToggle(szybkosc*, funkcjaZwrotna*)

płynnie pokazuje lub ukrywa element

Opcjonalny parametr szybkość określa szybkość zanikania. Możemy go podać słownie za pomocą słów "slow", "medium", "fast", ale najczęściej podaje się go w formie milisekund. Parametr funkcjaZwrotna to funkcja, która zostanie wykonana po zakończeniu zanikania:

Przykład użycia:

Płynne zwijanie i rozwijanie elementów

Bardzo podobnymi w użyciu są metody służące do zwijania/rozwijania elementów:

Nazwa metody
Co robi

$el.slideDown(szybkosc*, funkcjaZwrotna*)

płynnie rozwija element

$el.slideUp(szybkosc*, funkcjaZwrotna*)

płynnie zwija element

$el.slideToggle(szybkosc*, funkcjaZwrotna*)

płynnie zwija lub rozwija element

Przykład użycia:

Tworzenie nowych elementów

Aby utworzyć nowy element za pomocą jQuery wystarczy skorzystać z podobnej konstrukcji co w przypadku pobierania elementów ze strony:

Tak jak w przypadku innych metod, tutaj też mamy kilka sposobów działania z nowymi elementami:

Dołączanie elementów do strony

Aby dołączyć element do strony możemy skorzystać z jednej z kilku metod:

$parent.append($el)
Dołącza insertEl na końcu parenta

$parent.prepend($el)

Dołącza insertEl na początku parenta

$parent.before($el)

Dołącza insertEl przed danym elementem

$parent.after($el)

Dołącza insertEl za danym elementem

Usuwanie elementów ze strony

Aby usunąć element, skorzystamy z metody remove():

Data

W lekcji o właściwościach elementów poznałeś właściwość dataset. Właściwość ta opiera się o customowe atrybuty data-...:

jQuery udostępnia nam metodę data(), która działa dość podobnie - ale nie do końca.

Otóż jQuery tworzy za naszymi plecami dla każdego elementu obiekt z danymi, który możemy wykorzystać do przechowywania dodatkowych danych związanych z danym elementem.

Obiekt ten początkowo tworzony jest w oparciu o atrybuty data-...:

Różnica w stosunku do wersji Vanilla JavaScript jest taka, że po dodaniu do tego obiektu nowej właściwości, nie pojawia się ona jako atrybut elementu (w wersji JavaScript się pojawia), a tylko zapisywana jest w obiekcie data. Aby to sprawdzić, kliknij i sprawdź poniższe przyciski w debuggerze. W wersji JavaScript zobaczysz, że właściwość dodana do dataset trafiła do atrybutów elementu.

Wesja JavaScript Wersja jQuery

Aby dodać nowe dane do metody data(), wystarczy podać ich nazwy i wartości w nawiasach. Jeżeli chcemy odczytać dane, wtedy podajemy tylko ich nazwy:

Pytanie, które może się nasunąć to czemu jQuery poszło inną drogą niż Vanilla JavaScript? Ano z prostego powodu. Atrybuty data-... (a więc i cała właściwość dataset) dobrze się sprawdzają przy przetrzymywaniu prostych tekstów. Ale już trzymanie tam innych typów danych wcale fajne nie jest. W przypadku jQuerowego (tak to sie odmienia?) data nie ma takich problemów.

Last updated