Event#
new Event()#
Interfejs Event może być wywoływany w roli konstruktora, dzięki czemu pozwala na bezpośrednie tworzenie nowych zdarzeń (syntetycznych) wprost z interfejsu. Przy tworzeniu nowego zdarzenia od razu ustalany jest jego typ (pierwszy argument) oraz specyficzne cechy ustawiane za pomocą opcjonalnego słownika EventInit (drugi argument).
Składnia#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var new_event = new Event(type [, eventInitDict]);
gdzie poszczególne człony oznaczają:
new_event- referencja do nowego zdarzenia.type- typ zdarzenia w postaci łańcucha znakowego. Może to być dowolny łańcuch znakowy (nawet pusty).eventInitDict- opcjonalny obiekt określający szczegółowe kryteria inicjalizacji zdarzenia. Oto dostępne właściwości dla obiektu:bubbles- boolowskietrueoznacza, że zdarzenie zezwala na obsługę fazy bąbelkowania. Domyślną wartością jest boolowskiefalse.cancelable- boolowskietrueoznacza, że domyślne akcje dla zdarzenia mogą zostać anulowane. Domyślną wartością jest boolowskiefalse.
Algorytm wywołania konstruktora new Event(type, eventInitDict) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Zwróć nowe zdarzenie za pomocą algorytmu tworzenia zdarzenia z typem
typei słownikiemeventInitDict(jeśli występuje).
Obiekt zwracany przez konstruktor new Event() implementuje interfejs Event, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).
Nowy obiekt zdarzenia będzie miał ustawiane domyślne wartości dla wszystkich swoich właściwości i dodatkowo zostanie automatycznie zainicjowany zgodnie z przekazanymi argumentami przy jego wywołaniu, w przeciwieństwie do polecenia Document.createEvent(), dlatego może być od razu wysłany za pomocą metody EventTarget.dispatchEvent().
W ramach uzupełnienia warto przeanalizować wady i zalety poszczególnych poleceń odpowiedzialnych za tworzenie niezaufanych zdarzeń.
Ze względów bezpieczeństwa zdarzenia generowane przy użyciu konstruktora new Event() muszą ustawiać wartość właściwości Event.isTrusted na boolowskie false.
Prosty przykład:
<script>
// Tworzymy nowe zdarzenie
var event1 = new Event("piesek");
document.write(event1); // [object Event]
document.write("<br>");
document.write(event1.type); // piesek
document.write("<br>");
document.write(event1.bubbles); // false
document.write("<br>");
document.write(event1.cancelable); // false
document.write("<br>");
document.write(event1.defaultPrevented); // false
document.write("<br>");
document.write(event1.isTrusted); // false
document.write("<br>");
document.write(event1.eventPhase); // 0
document.write("<br>");
document.write(event1.timeStamp); // liczba całkowita z wartością zależną od chwili uruchomienia przykładu
document.write("<br>");
document.write(event1.currentTarget); // null
document.write("<br>");
document.write(event1.target); // null
document.write("<br><br>");
// Tworzymy kolejne zdarzenie
var event2 = new Event("click", {bubbles: true, cancelable: true});
document.write(event2); // [object Event]
document.write("<br>");
document.write(event2.type); // click
document.write("<br>");
document.write(event2.bubbles); // true
document.write("<br>");
document.write(event2.cancelable); // true
document.write("<br>");
document.write(event2.defaultPrevented); // false
document.write("<br>");
document.write(event2.isTrusted); // false
document.write("<br>");
document.write(event2.eventPhase); // 0
document.write("<br>");
document.write(event2.timeStamp); // liczba całkowita z wartością zależną od chwili uruchomienia przykładu
document.write("<br>");
document.write(event2.currentTarget); // null
document.write("<br>");
document.write(event2.target); // null
</script>Na chwilę obecną wszystkie aktualne przeglądarki pozwalają na wywoływanie interfejsu Event w roli konstruktora, oczywiście z wyjątkiem IE11.
Interfejs Web IDL#
[Constructor(DOMString type, optional EventInit eventInitDict), Exposed=(Window,Worker)]
interface Event {
};
dictionary EventInit {
boolean bubbles = false;
boolean cancelable = false;
};