jQuery - lomilowka.pl

Transkrypt

jQuery - lomilowka.pl
jQuery
jQuery – lekka biblioteka programistyczna dla języka JavaScript, ułatwiająca korzystanie z
JavaScriptu (w tym manipulację drzewem DOM). Kosztem niewielkiego spadku wydajności w
stosunku do profesjonalnie napisanego kodu w niewspomaganym JavaScripcie pozwala osiągnąć
interesujące efekty animacji, dodać dynamiczne zmiany strony, wykonać zapytania AJAX.
Większość wtyczek i skryptów opartych na jQuery działa na stronach nie wymagając zmian w
kodzie HTML (np. zamienia klasyczne galerie złożone z miniatur linkujących do obrazków w
dynamiczną galerię).
Funkcjonalność
jQuery pozwala w wygodny i zrozumiały sposób korzystać z następujących funkcjonalności:
selektory – umożliwiają wybranie dowolnego podzbioru węzłów modelu DOM
atrybuty – jQuery pozwala przetwarzać atrybuty węzłów dokumentu
manipulowanie modelem DOM
zmiana i przypisywanie stylu do elementów
rozbudowana obsługa zdarzeń, możliwość definiowania własnych
efekty – animacje
AJAX – prosty interfejs realizujący asynchroniczne zapytania
Podstawowe cechy
Niezależność od przeglądarki – eliminuje konieczność dostosowywania kodu do różnych
przeglądarek WWW
pełna funkcjonalność w: IE 6.0+ (oprócz interfejsu AJAX), Firefox 2+, Safari 3.0+, Opera
9.0+, Chrome
Obsługa selektorów zgodna z CSS3
Małe rozmiary – produkcyjna wersja to tylko ok 80 kB
Wygoda tworzenia wtyczek
Użycie
Z biblioteki jQuery można korzystać na dwa sposoby:
Użyć funkcji $ lub jQuery ($ jest standardowym aliasem obiektu jQuery). Funkcja ta i inne
metody zwracają obiekt jQuery, co oznacza, że można łatwo łączyć je w łańcuch wywołań.
Używać $. lub jQuery. jako swoistego prefiksu. Czyli korzystać z metod narzędziowych nie
operujących na obiekcie jQuery jako takim.
Zaczynamy
Aby zacząć używać jQuery, będziemy musieli standardowo dołączyć jej plik do naszej strony.
Możemy albo ściągnąć na dysk albo odwołać się np do zewnętrznych zasobów np:
<script type="text/javascript" src="sciezka-do-pliku/jquery.js"></script> //gdy
ściągniemy sobie plik
/* lub */
<script src="http://code.jquery.com/jquery-latest.min.js"></script> /* najnowsza
wersja jquery */
/* lub */
//https://developers.google.com/speed/libraries/devguide#jquery
<script
src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> /*
konkretna wersja jquery */
Osobiście polecam ostatnią wersję. Z najnowszymi wersjami jQuery czasami trzeba uważać. Np
przy przejściu z v.1 na v.2 kilka funkcji zostało usuniętych i niektóre pluginy przestały działać.
Jednym z lepszych sposobów wrzucania tej bilioteki na stronę jest poniższa, która w razie
niemozności ściągnięcia jquery z zewnetrznego zasobu spróbuje ją pobraź z lokalnego pliku:
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="sciezka-dopliku/jquery.js"><\/script>')</script>
Możemy też połączyć oba sposoby, co jest najbezpieczniejszym sposobem. Jeżeli jquery nie
zostanie pobrane z zewnętrzengo adresu, wówczas uruchomimy ją lokalnie poprzez utworzenie
skryptu z src wskazującym na lokalny zasób:
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>!window.jQuery && document.write('<script
src="jquery.min.js"><\/script>')</script>
Osobiście polecam właśnie tą metodę. Pobieranie jQuery z zewnątrz nie obciążą naszego łącza plus
udostępnia zawsze najnowszą wersję tej biblioteki. Dodatkowe informacje znajdziesz
Znak $ i składnia łańcuchowa
jQuery ma bardzo zwięzłą konstrukcję skryptów, do której wykorzystuje składnię łańcuchową.
Każdy taki łańcuch rozpoczyna się znakiem $, a poszczególne polecenia są łączone w łańcuchy za
pomocą kropki. Poniższy przykład ilustruje zastosowanie jquery:
$('#pierwszy').css('color','red').hide('slow').show(3000);
Powyższe polecenie wystarczy podzielić względem kropek:
1. Pobieramy obiekt #pierwszy, po czym wykonujemy na nim kilka operacji:
1. Ustawiamy mu kolor na czerwony
2. Ukrywamy go (wolno)
3. Po czym z wolna pokazujemy (3 sekundy)
Kliknij mnie
Banalna sprawa - prawda?. Ileż kodu trzeba by było napisać w czystym JS żeby uzyskać podobne
efekt. Dodatkowo trzeba by było obsłużyć kilka wersji przeglądarek...
Poniżej zamieszczam kilka przykładów dla pobierania elementów ze strony:
$('*')
$(div)
$('div.czerwony')
$('div.czerwony#duzy')
$('div p')
$('div#cont > p')
id cont
$('p,span , div.czerwoy')
czerwony
$('ul li.wyroznione')
$('p:first')
$('img[width=100]')
$('label + input')
mają label
$('div#pierwszy ~ div')
//pobranie wszystkich elementów na stronie
//pobranie wszystkich divów na stronie
//pobranie div o klasie czerwony
//pobranie div o klasie czerwony i id duży
//wszystkie p zawierające się w div
//wszystkie p mieszczące się bezpośrednio w div o
//pobranie wszystkich p, span oraz divów o klasie
//pobranie li o klasie wyróżnione
//pobranie pierwszego p
//pobranie wszystkich img, które mają width=100
//wszystkie inputy, które bezpośrednio przed sobą
//wszystkie divy, które następują po div#pierwszy
Jak widać, w większości przypadków wystarczy wykorzystać prostą składnię CSS.
JQuery udostępnia także sporo metod dodatkowych, które możemy wykorzystać do pobrania
obiektów.
Wśród nich możemy wymienić takie jak:
• eq(index) - czyli pobierz z listy pobranych elementów element z danym indeksie,
• lt(index) - pobierz elementy o indeksie mniejszym od danego,
• gt(index) - pobierz elementy o indeksie większym itp.
$('*') //pobranie wszystkich elementów na stronie
$('div.czerwony p').eq(2) //pobranie trzeciego p w div.czerwony
$('p span').gt(1).css({color:red,fontWeight:bold}) //wszystkie spany w p z
pominięciem pierwszego ustawione mają kolor czerwony i są przekreślone
Podobnych pobrań można wymieniać w nieskończoność...
Nie ma sensu wymieniać ich wszystkich w tym miejscu. Wystarczy odwiedzić stronę
http://jqapi.com/ po czym przejść do zakładki Selectors > Basic filters (okazyjnie przeglądając i
inne zakładki).
document ready
Aby operować na elemetach strony powinniśmy je pobrać. Aby mieć pewność, że takie elementy
już istnieją (czyli, że dokument DOM został już wczytany), skorzystamy z instrukcji $
(document).ready, która wywoła wewnętrzny kod dopiero po załadowaniu całego dokumentu
strony.
?
$(document).ready(function() {
//tutaj nasze skrypty jquery
})
//lub ekwiwalent
$(function() {
//tutaj nasze skrypty
})
W praktyce 99% skryptów jQuery wstawiane jest wewnątrz tej konstrukcji, dlatego musimy ją znać
jak paciorek.
Aby się nie powtarzać w nieskończoność, w poniższych przykładach będę zamieszczał tylko
omawiane części kodu. W praktyce każdy z nich powinien zawierać stosowne tagi oraz część $
(function() {....})
Mam nadzieję, że czytając poniższy kody będziesz w stanie spokojnie sobie je przerobić dla
własnych celów.
Eventy w jquery
Obługa zdarzeń w jquery jest dziecinnie prosta. Wystarczy przypiąć zdarzenie do pobranego
obiektu bezpośrednio, lub skorzystać z metody bind().
?
$('input#guzik').click(function() {
console.log('test');
})
//lub
$('input#guzik').bind('click', function() {
console.log('test');
})
//lub w wersji > 1.4
$('input#guzik').bind({
'click' : function() {
console.log('test');
}
})
Dla przycisku #guzik przypisaliśmy zdarzenie click, w którym wykonujemy anonimową funkcję.
Wypisuje ona w konsoli firebuga tekst "test" (jeżeli nie masz FF wraz z tym dodatkiem, zamień tą
linijkę na inną komendę typu alert() albo podobną). Nie ma znaczenia którą metodę przypisania
użyjemy - wszystkie działają identycznie. Ostatnia metoda wydaje się nieco długa, jest ona jednak
bardzo czytelna, jeżeli chcemy podpiąć pod dany obiekt kilka zdarzeń na raz.
Aby odwołać się do obiektu wywołującego, wskazujemy go instrukcją this. To już wiemy z
rozdziału o zdarzeniach. Nas jednak nie interesuje "czysty" obiekt js, a jego jquerowy odpowiednik.
Aby taki obiekt uzyskać, wystarczy nasz "this" podstawić pod jquery, stosując konstrukcję $(this).
Dzięki temu uzyskujemy obiekt jquery wskazujący na wywołujący element.
$('a.link').click(function() {
alert($(this).attr('href'));
return false;
})
<a class="link" href="http://jakis_adres.com">Pokaż href</a>
<a class="link" href="http://jakis_inny_adres.com">Pokaż href</a>
Pokaż href Pokaż href
$('p').each(function() {
var $t = $(this);
$t.css({
"color" : "blue",
"text-decoration" : "underline"
});
$t.click(function() {
alert('Link prowadzi do: ' + $(this).attr('href'))
})
})
Dla każdego (each) pobranego p wykonujemy funkcję, w której ustawiamy dla p kolor niebieski
wraz z podkreśleniem, oraz ustawiamy zdarzenie click, w którym wykonujemy funkcję
wyświetlającą okienko alert z atrybutem href danego p. Znak $ przy nazwie zmiennej $t to tylko
ułatwienie dla nas. Dzięki temu wiemy, że dana zmienna jest obiektem jquery, i możemy dla niej
wywoływać wszystkie metody tej biblioteki.
Oczywiście uniwersalnosć jQuery sprawia, że powyższy kod możemy nieco "spakować":
$('p').css({color:blue,textDecoration:underline})
.click(function() {
alert('Link prowadzi do: ' + $(this).attr('href'))
})
Animacja w jQuery
jQuery udostępnia kilka ciekwych efektów gotowych do użycia:
• show(szybkosc, funkcja_zwrotna) - pokazanie obiektu. Parametry są opcjonalne. Szybkość
możemy podać zarówno słownie: "slow", "normal", "fast", lub liczbowo. Parametr f
wskazuje nazwę funkcji która zostanie wywołana po zakończeniu animacji. Można tutaj
zastosować funkcję anonimową:
• hide(szybkosc, funkcja_zwrotna) - ukrywa obiekt:
?
$("div#ukryty").click(function() {
$(this).hide('slow', function() {
console.log('obiekt został ukryty');
});
});
• fadeIn(szybkość, funkcja_zwrotna) - płynne pojawianie się obiektu.
?
$("a").click(function () {
$("div").fadeIn(3000);
return false;
});
• toggle() - funkcja pokazuje lub ukrywa obiekt w zależności od danego stanu
• fadeOut(szybkość, funkcja_zwrotna) - płynne ukrywanie obiektu.
• fadeTo(szybkość, przezroczystość, funkcja_zwrotna) - płynne ustawienie
przezroczystości do poziomu z parametru "przezroczystość":
?
$("a").click(function() {
$("div#pierwszy").fadeTo(2000, 0.32);
});
• slideDown(szybkość, funkcja_zwrotna) - płynne "wysunięcie" obiektu w dół
• slideUp(szybkość, funkcja_zwrotna) - płynne "zsunięcie" obiektu w górę
• slideToggle(szybkość, funkcja_zwrotna) - płynne "zsunięcie" obiektu w górę lub dół - w
zależności od aktualnego stanu
Są to standardowe efekty jQuery i w większości przypadków wystarczają do naszych zastosowań.
Są jednak przypadki, że chcielibyśmy stworzyć własną animację.
Możemy to zrobić za pomocą metody animate(animowane_wlasciwosci, czas, rodzaj_animacji,
funkcja_zwrotna). Najbardziej interesującymi nas parametrami są "animowane_wlasciwosci", w
których podajemy atrybuty css, oraz czas w którym wykona się animacja:
$("#go").click(function(){
$("#block").animate({
width: "500px",
opacity: 0.4,
marginLeft: "0.6in",
fontSize: "3em",
borderWidth: "10px"
}, 1500 );
});
Parametr funkcja_zwrotna jak w przypadku pozostałych efektów wywołuje funkcję, która wykona
się po zakończeniu animacji.
Parametr rodzaj_animacji określa przebieg animacji. jQuery posiada wbudowane dwa rodzaje
przebiegu animacji: "linear" i "swing". Aby skorzystać z innych rodzajów, powinniśmy skorzystać z
dodatkowych pluginów do jQuery, np. tego: http://gsgd.co.uk/sandbox/jquery/easing/.
?
$("p#nty").click(function() {
$(this).animate({
height:200,
width:400,
opacity: 0.5
}, 1000, 'linear', function(){ alert("koniec animacji");
});
});
W powyższych przykładach animowane właściwości ustawiłem na sztywno.
W jQuery od wersji 1.2 można zastosować konstrukcję -= lub += która odejmie lub doda
odpowiednią wielkość od aktualnej:
$("#go2").click(function(){
$("#block2").animate({
width: "+= 300",
height: "+= 50",
opacity: "-= 0.5",
duration : 1000 //<- inny sposób deklaracji czasu trwania animacji
});
});
DIV
Na zakończenie tego działu przyjżyjmy się pewnej sytuacji. Mamy blok, po najechaniu na który
chcemy płynnie zmienić jego rozmiary w zależności od tego czy kursor na nim jest czy nie.
$('#balonik_test')
.mouseover(function() {
$(this).animate({width:300}, 500);
})
.mouseout(function() {
$(this).animate({width:200}, 500);
});
Jeżeli mamy drewno zamiast palcy, a nasza obsługa komputera powoduje, że nasi znajomi wydają
dziwne dźwięki, nie zauważymy żadnego problemu. Wystaczy jednak kilka razy szybko kliknąć na
powyższy blok, aby zobaczyć jak nasza animacja zaczyna szaleć.
Spowodowane jest to tym, że nasza animacja nie zdąży się do końca wykonać, a my chcemy
odpalić ją ponownie (click, click, click).
Aby temu zapobiec musimy posiłkować się dowolną z dwóch technik. Pierwsza z nich polega na
wykorzystaniu metody stop(), która zatrzyma odpaloną animację.
Druga metoda polega na odpalaniu kolejnej animacji dopiero po skończeniu działania poprzedniej.
Wykorzystamy do tego warunek .is(':animated') lub .not(':animated'). Pierwszy odfiltruje
elementy, które są animowane, a drugi te, które animowane nie są. Poniższe przykłady demonstrują
obie metody:
$("#balonik_stop")
.mouseover(function() {
$(this).stop().animate({width:300}, 500);
})
.mouseout(function() {
$(this).stop().animate({width:200}, 500);
});
Najedź na mnie
$("#balonik_not").toggle(
function(){
$(this).not(':animated').animate({width:300}, 500);
},
function(){
$(this).not(':animated').animate({width:200}, 500);
}
);
//lub
$("#balonik_not").toggle(
function(){
if (!$(this).is(':animated')) $(this).animate({width:300}, 500);
},
function(){
if (!$(this).is(':animated')) $(this).animate({width:200}, 500);
}
);
W praktyce powyższe dwa sposoby sprawdzają się w innych zastosowaniach. Metoda stop() lepiej
sprawdza się w zdarzeniach mouseover i mouseout, natomiast sprawdzanie czy obiekt jest
animowany lepiej stosować przy zdarzeniach click.

Podobne dokumenty