Ogólne#
Events#
W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w dziale Events, czyli mogą mieć one zastosowanie dla wszystkich interfejsów z tego działu.
Pojęcia#
W specyfikacji D3E pojęcie wysłania (dispatch) i odpalenia (fire) zdarzenia jest równoważne. Specyfikacja DOM4 bardziej konkretyzuje odpalanie zdarzeń.
event fire
Odpalenie zdarzenia o nazwie e # (fire an event named e) oznacza, że nowe zdarzenie używające interfejsu Event, z atrybutem type ustawianym na e i z atrybutem isTrusted ustawianym na boolowską wartość true, jest wysłane do danego obiektu.
Odpalenie w kontekście DOM jest krótszym zapisem dla zainicjowania i wysłania jakiegoś zdarzenia.
Odpalenie zdarzenia jest koncepcją, która ma ułatwić zapis całego procesu. Jeśli zdarzenie wymaga ustawienia jego atrybutu bubbles lub cancelable, to można dla przykładu napisać tak: "odpal zdarzenie o nazwie submit z jego atrybutem cancelable ustawianym na boolowską wartość true.
Łatwo zauważyć, że koncepcja odpalenia zdarzenia dotyczy tylko zaufanych zdarzeń, czyli jest rezerwowana dla zdarzeń generowanych przez aplikacje klienckie.
Algorytmy#
constructing events
Aby utworzyć zdarzenia # (constructing events) za pomocą interfejsu Event w roli konstruktora # (constructor), czy też innego interfejsu dziedziczącego po interfejsie Event, to w chwili jego wywołania należy wykonać następujące kroki:
- Utwórz nowe zdarzenie, które korzysta z interfejsu wywoływanego konstruktora.
- Ustaw flagę inicjalizacji.
- Ustaw atrybut
typena argument type. - Jeśli argument eventInitDict został przekazany, to dla każdego (for each) członka słownika zdefiniowanego w nim znajdź atrybut zdarzenia, którego identyfikator pasuje do klucza członka słownika i ustaw atrybut na wartość tego członka słownika.
- Zwróć nowo utworzone zdarzenie.
initialize
Aby zainicjować # (initialize) zdarzenie event, z typem type, bąbelkowaniem bubbles i anulowaniem cancelable, należy wykonać następujące kroki:
- Ustaw flagę inicjalizacji.
- Jeśli flagę wysłania jest ustawiona, to pomiń kolejne kroki.
- Usuń flagę zatrzymania propagacji, flagę natychmiastowego zatrzymania propagacji oraz flagę anulowania.
- Ustaw atrybut
isTrustedna boolowską wartośćfalse. - Ustaw atrybut
targetna wartośćnull. - Ustaw atrybut
typena type. - Ustaw atrybut
bubblesna bubbles. - Ustaw atrybut
cancelablena cancelable.
dispatch
Aby wysłać # (dispatch) zdarzenie do danego obiektu, z opcjonalnym nadpisaniem celu target override, należy wykonać następujące kroki:
- Niech event będzie zdarzeniem, które ma być wysyłane.
- Ustaw flagę wysłania dla event.
- Ustaw atrybut
targetw event na target override, jeśli został przekazany, lub na obiekt, do którego event ma być wysłany. - Jeśli wartość atrybut
targetw event należy do drzewa węzłów, niech event path będzie statyczną uporządkowaną listą wszystkich jego przodków, zgodnie z porządkiem drzewa, w przeciwnym razie niech event path będzie pustą listą. - Ustaw atrybut
eventPhasew event na wartośćCAPTURING_PHASE. - Dla każdego (for each) obiektu w event path wywołuj jego nasłuchy zdarzeń ze zdarzeniem event, tak długo, jak flaga zatrzymania propagacji dla event jest nieaktywna.
- Ustaw atrybut
eventPhasew event na wartośćAT_TARGET. - Wywołuj na wartości atrybutu
targetw event nasłuchy zdarzeń ze zdarzeniem event, jeśli flaga zatrzymania propagacji dla event jest nieaktywna. - Jeśli wartością atrybut
bubblesw event jest boolowskietrue, to wykonaj poniższe podkroki:- Odwróć kolejność w event path.
- Ustaw atrybut
eventPhasew event na wartośćBUBBLING_PHASE. - Dla każdego (for each) obiektu w event path wywołuj jego nasłuchy zdarzeń ze zdarzeniem event, tak długo, jak flaga zatrzymania propagacji dla event jest nieaktywna.
- Usuń flagę wysłania dla event.
- Ustaw atrybut
eventPhasew event na wartośćNONE. - Ustaw atrybut
currentTargetw event na wartośćnull. - Zwróć boolowską wartość
falsejeśli flaga anulowania dla event jest ustawiona, w przeciwnym razie zwróć boolowską wartośćtrue.
invoke
Aby wywołać # (invoke) nasłuchy zdarzeń ze zdarzeniem dla danego obiektu, należy wykonać następujące kroki:
- Niech event będzie zdarzeniem, dla którego nasłuchy zdarzeń mają być wywołane.
- Niech listeners będzie kopią nasłuchów zdarzeń powiązanych z obiektem, dla którego opisywane kroki są wykonywane.
- Ustaw atrybut
currentTargetw event na obiekt, dla którego opisywane kroki są wykonywane. - Dla każdego (for each) nasłuchu zdarzenia w listeners wykonaj poniższe podkroki:
- Jeśli flaga natychmiastowego zatrzymania propagacji dla event jest ustawiona, to przerwij algorytm wywołania.
- Niech listener będzie nasłuchem zdarzenia.
- Jeśli wartością atrybut
typew event nie jest typ w listener, to pomiń te podkroki (i uruchom je dla następnego nasłuchu zdarzenia). - Jeśli wartością atrybut
eventPhasew event jestCAPTURING_PHASEi przechwytywanie w listener ma boolowską wartośćfalse, to pomiń te podkroki (i uruchom je dla następnego nasłuchu zdarzenia). - Jeśli wartością atrybut
eventPhasew event jestBUBBLING_PHASEi przechwytywanie w listener ma boolowską wartośćtrue, to pomiń te podkroki (i uruchom je dla następnego nasłuchu zdarzenia). - Wywołaj funkcję zwrotną
handleEventw listener, ze zdarzeniem przekazanym do tego algorytmu jako pierwszym argumentem i wartością atrybutcurrentTargetw event będącą wartościąthisfunkcji zwrotnej.