MooTools 1.2 - Obiekt Event
10 lipca, 2008
Obiekt Event w MooTools 1.2 posiada kilkanaście nowych właściwości oraz trzy metody. Te metody będą nam przydatne w wypadku operowania na elementach dokumentu oraz w połączeniu z poznanymi w poprzedniej części kursu możliwościami obietu Function.
Gdy chcemy uniknąć propagacji zdarzeń
Metoda stopPropagation jest przydatna na przykład w sytuacji gdy element nadrzędny posiada przypisane zdarzenie, dla przykładu onclick - wtedy po dodaniu tego zdarzenia do elementu potomnego kliknięcie w tenże element powoduje wywołanie dwóch zdarzeń - elementu potomnego i jego rodzica. Aby tego uniknąć stosujemy metodę stopPropagation:
obiektKlasyEvent.stopPropagation();
Powyższy kod umieszczony w funkcji przypisanej do obserwatora zdarzeń spowoduje, że żadne zdarzenia z elementów nadrzędnych nie będą wykonywane - wykona się jedynie zdarzenie wywoływane.
Unikamy domyślnej operacji
Druga istotna metoda to preventDefault:
obiektKlasyEvent.preventDefault();
Metoda ta jest niezwykle przydatna w wypadku zdarzeń onclick takich elementów jak linki czy chociażby przycisk submit w formularzu. Dlaczego ? Domyślnie po kliknięciu w link niezależnie od tego co dalej zrobimy zostaniemy przeniesieni do adresu wskazywanego przez atrybut href linka. Metoda preventDefault blokuje tę standardową akcję. Warto zauważyć, że w wypadku przycisku submit w formularzu jest to nieoceniona pomoc - gdy mamy interfejs który pracuje zarówno z jak i bez JS - możemy dzięki temu mieć pewność, że użytkownicy korzystający z JS zostaną od razu poinformowaniu o błędach w formularzy, a osoby z wyłączonym JS ujrzą stosowny komunikat po wysłaniu formularza.
Można też zrobić to naraz
Jeżeli musimy naraz powstrzymać propagowanie zdarzeń i akcję domyślną możemy skorzystać z metody stop:
obiektKlasyEvent.stop();
Powyższy zapis jest równoznaczny zapisowi:
obiektKlasyEvent.stopPropagation(); obiektKlasyEvent.preventDefault();
czyli krótko mówiąc - takie dwa w jednym.
Właściwości klasy Event
Omówię teraz właściwości obiektów klasy Event:
Poniższe właściwości przyjmują wartość true, jeżeli użytkownik naciśnie dany klawisz:
- Event.shift - klawisz Shift,
- Event.control - klawisz Ctrl,
- Event.alt - klawisz Alt,
- Event.meta - metaklawisz.
Obiekt Event ma także właściwość związaną z rolką myszki:
- Event.wheel - właściwość ta zwraca nam ilość obrotów rolki (wartości ujemne przy przewijaniu w dół i wartości dodanie przy przewijaniu w górę - zawsze są to liczby całkowite),
Dzięki obiektowi klasy Event możemy także odczytać dokładniejsze informacje o wciskanych klawiszach:
- Event.code - kod wciśniętego klawisza,
- Event.key - wartość wciskanego klawisza (małe litery). Dodatkowo klawisze mogą mieć wartości: 'enter', 'up', 'down', 'left', 'right', 'space', 'backspace', 'tab', 'delete', 'esc'.
Dzięki poniższym właściwościom możemy odczytać dokładną pozycję kursora myszki:
- Event.page.x - współrzędna x kursora myszki względem całego okna.
- Event.page.y - współrzędna y kursora myszki względem całego okna.
- Event.client.x - współrzędna x kursora myszki względem widocznego fragmentu okna.
- Event.client.y - współrzędna y kursora myszki względem widocznego fragmentu okna.
Dodatkowo właściwość Event.rightClick informuje nas czy został naciśnięty prawy klawisz myszki.
Na koniec dwie właściwości związane z elementem, którego dotyczy zdarzenie:
- target - ta właściwość zwraca uchwyt do elementu dla którego zostało wykonane zdarzenie.
- relatedTarget - dzięki tej właściwości możemy uzyskać uchwyt do elementu nad jakim znalazł się kursor po opuszczeniu obszaru elementu z przypisanym zdarzeniem mouseout.
Ja osobiście bardzo upodobałem sobie właściwość target - dzięki niej mogę drastycznie ograniczyć ilość event listenerów - zamiast tworzyć kilkanaście zdarzeń, tworzę jedno i na podstawie wartości tej właściwości wykonuję odpowiednią operację - jest to nieoceniona pomoc zwłaszcza w wypadku interfejsów opartych na AJAX, gdzie pewne elementy mogą być ładowane dynamicznie - dzięki stosowaniu właściwości target nie trzeba tworzyć kilkunastu event listenerów przy każdym wczytaniu danych. Z pewnością zaprezentuję tą użyteczną metodę w przykładach omawiających manipulowanie elementami dokumentu - póki co ciągle studiujemy teoretyczne podstawy MooTools.
Pozostał nam jeszcze obiekt Event.keys - zawiera on kody wybranych klawiszy. Jeżeli chcemy do wartości zwracanych przez właściwość key obiektu Event dodać własne klawisze z własnymi nazwami stosujemy zapis:
Event.keys.nazwaKlawisza = kodKlawisza;
Dzięki temu możemy potem stosować zapis postaci:
if(event.key == "nazwaKlawisza") { ... }
Powiązanie z metodą bindWithEvent
Na sam koniec opiszę wspomniane w poprzedniej części kursu powiązanie pomiędzy metodą bindWithEvent, a obiektem Event. Będzie to jednocześnie podsumowanie dla poznanych metod tego obiektu.
Musimy pamiętać, że funkcja, która korzysta z metody bindWithEvent musi jako pierwszy argument pobierać uchwyt do zdarzenia:
var obslugaZdarzenia = function(event){ ... }
Wtedy jeżeli wykonamy:
obslugaZdarzenia.bindWithEvent();
To w ciele funkcji obslugaZdarzenia zmienna event będzie służyła jako uchwyt do zdarzenia.
Oczywiście musimy pamiętać, że:
obslugaZdarzenia.bindWithEvent();
musi zostać przypisane jako funkcja obsługi zdarzenia. Na razie możemy zrobić to tak:
uchwytDoElement.addEventListener("click", obslugaZdarzenia.bindWithEvent() ,false);
ale z czasem wykorzystam do tego funkcję addEvent, która poznamy nieco później.
W każdym razie mając już w zmiennej event uchwyt do zdarzenia, możemy na jego podstawie utworzyć obiekt Event:
var obslugaZdarzenia = function(event){ var zdarzenie = new Event(event); }
A potem już możemy odwoływać się do wszystkich metod i właściwości tegoż obiektu:
var obslugaZdarzenia = function(event){ var zdarzenie = new Event(event); zdarzenie.stop(); }
Podsumowanie
Teorię już znamy - na praktykę przyjdzie czas podczas omawiania pliku Element.Event i nie tylko.
W następnej części kursu zajmiemy się ciągami znaków (obiekt String).
Komentarze do wpisu "MooTools 1.2 - Obiekt Event":
1.
Piter2k1 napisał(a):
03 września 2008, 16:16:39
A czy istnieje zdarzenie typu „toggle” jak w jQuery? czy po prostu trzeba samemu zaimplementować?
2.
Dziudek napisał(a):
03 września 2008, 16:36:14
@Piter2k1 – to jest raczej do zaimplementowania samemu. Zasadniczo najważniejszą kwestią w tym wypadku jest przechowanie ilości kliknięć danego elementu – można to zrobić na przykład dzięki nowym możliwościom do przechowywania danych w elemencie – będzie o tym niedługo w moim kursie w razie czego :)
3.
Piter2k1 napisał(a):
04 września 2008, 22:53:46
A więc czekam na kolejne artykuły :) Mam nadzieję że napiszesz też coś o klasie Request, ostatnio miałem z nią problem :( Chodzi o to że ściąga dane z zew. pliku tylko raz… albo coś źle robię :)
4.
pionar napisał(a):
28 marca 2009, 08:24:00
toogle jak najbardziej jest w mootools.
Dodaj komentarz: