EventTarget#
EventTarget.dispatchEvent()#
Metoda dispatchEvent() wysyła konkretne zdarzenie (syntetyczne) do danego celu zdarzenia. Metoda zwraca także boolowską wartość false jeśli domyślne akcje dla zdarzenia zostały odwołane w czasie propagacji zdarzenia, w przeciwnym razie zwrócona zostanie wartość true.
Składnia#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var prevented = eventTarget.dispatchEvent(event);
gdzie poszczególne człony oznaczają:
prevented- boolowskietruelubfalse.eventTarget- cel zdarzenia będący obiektem kontekstu.event- obiekt zdarzenia, który będzie wysyłany do celu zdarzenia.
Algorytm wywołania metody dispatchEvent(event) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Jeśli flaga wysłania dla
eventjest ustawiona lub flaga inicjalizacji dlaeventnie jest ustawiona, to zrzuć wyjątek"InvalidStateError". - Ustaw atrybut
isTrustedweventna boolowską wartośćfalse. - Wyślij
eventi zwróć wartość zwracaną przez ten algorytm.
Przed wysłaniem niezaufanych zdarzeń za pomocą metody dispatchEvent(), które utworzone zostały przy użyciu polecenia Document.createEvent(), należy je najpierw zainicjować. Zdarzenia tworzone za pomocą konstruktora new Event(), i pochodnych, są inicjowane automatycznie. Także zaufane zdarzenia są inicjowane automatycznie przez daną implementacje.
Ze względów bezpieczeństwa zdarzenia wysyłane przy użyciu metody dispatchEvent() muszą ustawiać wartość właściwości Event.isTrusted na boolowskie false.
Warto nadmienić, że po zakończeniu obsługi wszystkich faz zdarzenia może ono zostać ponownie wysłane. W razie konieczności obiekt zdarzenia można przeinicjować, czyli jeszcze raz ustawić jego kluczowe parametry, takie jak typ, bąbelkowanie lub anulowanie.
Prosty przykład:
<script>
// Tworzymy nowe syntetyczne zdarzenie
var event = new CustomEvent("piesek", {"detail": "husky"});
// Podpinamy uchwyt zdarzenia dla naszego syntetycznego zdarzenia
window.addEventListener("piesek", function(e) {
document.write(event); // [object CustomEvent]
document.write("<br>");
document.write(event.type); // piesek
document.write("<br>");
document.write(event.bubbles); // false
document.write("<br>");
document.write(event.cancelable); // false
document.write("<br>");
document.write(event.detail); // husky
document.write("<br>");
document.write(event.defaultPrevented); // false
document.write("<br>");
document.write(event.isTrusted); // false
document.write("<br>");
document.write(event.eventPhase); // 1
document.write("<br>");
document.write(event.timeStamp); // liczba całkowita z wartością zależną od chwili uruchomienia przykładu
document.write("<br>");
document.write(event.currentTarget); // [object Window]
document.write("<br>");
document.write(event.target); // [object HTMLDocument]
}, true);
// Wysyłamy syntetyczne zdarzenie z poziomu aplikacji
var return_value = document.dispatchEvent(event);
// Po upływie 2 s odczytujemy wartość zwracaną przez metodę dispatchEvent
setTimeout(function(){
document.body.innerHTML += "<br><br>" + return_value; // true
}, 2000);
</script>W przykładzie widać wyraźnie, że wysyłanie syntetycznych zdarzeń (nawet prywatnych) za pomocą metody dispatchEvent() spełnia wszystkie założenia mechanizmu przepływu zdarzeń DOM. Możemy tworzyć i wysyłać zdarzenia wprost z aplikacji do dowolnego obiektu (celu), a następnie przechwytywać je w konkretnej fazie propagacji zdarzenia za pomocą uchwytów zdarzeń.
Interfejs Web IDL#
boolean dispatchEvent(Event event);