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
type
na 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
isTrusted
na boolowską wartośćfalse
. - Ustaw atrybut
target
na wartośćnull
. - Ustaw atrybut
type
na type. - Ustaw atrybut
bubbles
na bubbles. - Ustaw atrybut
cancelable
na 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
target
w event na target override, jeśli został przekazany, lub na obiekt, do którego event ma być wysłany. - Jeśli wartość atrybut
target
w 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
eventPhase
w 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
eventPhase
w event na wartośćAT_TARGET
. - Wywołuj na wartości atrybutu
target
w event nasłuchy zdarzeń ze zdarzeniem event, jeśli flaga zatrzymania propagacji dla event jest nieaktywna. - Jeśli wartością atrybut
bubbles
w event jest boolowskietrue
, to wykonaj poniższe podkroki:- Odwróć kolejność w event path.
- Ustaw atrybut
eventPhase
w 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
eventPhase
w event na wartośćNONE
. - Ustaw atrybut
currentTarget
w event na wartośćnull
. - Zwróć boolowską wartość
false
jeś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
currentTarget
w 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
type
w event nie jest typ w listener, to pomiń te podkroki (i uruchom je dla następnego nasłuchu zdarzenia). - Jeśli wartością atrybut
eventPhase
w event jestCAPTURING_PHASE
i 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
eventPhase
w event jestBUBBLING_PHASE
i przechwytywanie w listener ma boolowską wartośćtrue
, to pomiń te podkroki (i uruchom je dla następnego nasłuchu zdarzenia). - Wywołaj funkcję zwrotną
handleEvent
w listener, ze zdarzeniem przekazanym do tego algorytmu jako pierwszym argumentem i wartością atrybutcurrentTarget
w event będącą wartościąthis
funkcji zwrotnej.