InputEvent#
new InputEvent()#
Interfejs InputEvent może być wywoływany w roli konstruktora, dzięki czemu pozwala na bezpośrednie tworzenie nowych zdarzeń wejścia (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 InputEventInit (drugi argument).
Składnia#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var new_inputEvent = new InputEvent(type [, inputEventInitDict]);
gdzie poszczególne człony oznaczają:
new_inputEvent- referencja do nowego zdarzenia.type- typ zdarzenia w postaci łańcucha znakowego. Może to być dowolny łańcuch znakowy (nawet pusty).inputEventInitDict- 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(dziedziczone z EventInit).cancelable- boolowskietrueoznacza, że domyślne akcje dla zdarzenia mogą zostać anulowane. Domyślną wartością jest boolowskiefalse(dziedziczone z EventInit).view- obiekt okna lub wartośćnull. Domyślną wartością jest wartośćnull(dziedziczone z UIEventInit).detail- szczegółowe informacje w postaci liczby całkowitej. Domyślną wartością jest0(dziedziczone z UIEventInit).data- łańcuch znakowy reprezentujący wygenerowane znaki dla zdarzenia. Domyślną wartością jest pusty łańcuch znakowy.isComposing- boolowskietrueoznacza, że zdarzenie jest częścią sesji kompozycji. Domyślną wartością jest boolowskiefalse.
Algorytm wywołania konstruktora new InputEvent(type, inputEventInitDict) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Zwróć nowe zdarzenie wejścia za pomocą algorytmu tworzenia zdarzenia z typem
typei słownikieminputEventInitDict(jeśli występuje).
Obiekt zwracany przez konstruktor new InputEvent() implementuje interfejs InputEvent, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia). Warto podkreślić, że i opcjonalny słownik InputEventInit dziedziczy ze słownika UIEventInit, dlatego ma dostęp do wszystkich jego członków w chwili przekazania do konstruktora.
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 InputEvent() muszą ustawiać wartość właściwości Event.isTrusted na boolowskie false.
Prosty przykład:
<script>
// Tworzymy nowe zdarzenie
var inputEvent1 = new InputEvent("piesek");
document.write(inputEvent1); // [object UIEvent]
document.write("<br>");
document.write(inputEvent1.type); // piesek
document.write("<br>");
document.write(inputEvent1.bubbles); // false
document.write("<br>");
document.write(inputEvent1.cancelable); // false
document.write("<br>");
document.write(inputEvent1.view); // null
document.write("<br>");
document.write(inputEvent1.detail); // 0
document.write("<br>");
document.write(inputEvent1.data); // 0
document.write("<br>");
document.write(inputEvent1.isComposing); // false
document.write("<br>");
document.write(inputEvent1.defaultPrevented); // false
document.write("<br>");
document.write(inputEvent1.isTrusted); // false
document.write("<br>");
document.write(inputEvent1.eventPhase); // 0
document.write("<br>");
document.write(inputEvent1.timeStamp); // liczba całkowita z wartością zależną od chwili uruchomienia przykładu
document.write("<br>");
document.write(inputEvent1.currentTarget); // null
document.write("<br>");
document.write(inputEvent1.target); // null
document.write("<br><br>");
// Tworzymy kolejne zdarzenie
var inputEvent2 = new InputEvent("piesek", {
bubbles: true,
cancelable: true,
view: window,
detail: 69,
data: "husky",
isComposing: true
});
document.write(inputEvent2); // [object UIEvent]
document.write("<br>");
document.write(inputEvent2.type); // piesek
document.write("<br>");
document.write(inputEvent2.bubbles); // true
document.write("<br>");
document.write(inputEvent2.cancelable); // true
document.write("<br>");
document.write(inputEvent2.view); // [object Window]
document.write("<br>");
document.write(inputEvent2.detail); // 69
document.write("<br>");
document.write(inputEvent2.data); // "husky"
document.write("<br>");
document.write(inputEvent2.isComposing); // true
document.write("<br>");
document.write(inputEvent2.defaultPrevented); // false
document.write("<br>");
document.write(inputEvent2.isTrusted); // false
document.write("<br>");
document.write(inputEvent2.eventPhase); // 0
document.write("<br>");
document.write(inputEvent2.timeStamp); // liczba całkowita z wartością zależną od chwili uruchomienia przykładu
document.write("<br>");
document.write(inputEvent2.currentTarget); // null
document.write("<br>");
document.write(inputEvent2.target); // null
</script>Na chwilę obecną jedynie przeglądarka Firefox zaimplementowała interfejs InputEvent i pozwala na jego wywoływanie w roli konstruktora, aczkolwiek bez obsługi właściwości data ze słownika InputEventInit.
Interfejs Web IDL#
[Constructor(DOMString type, optional InputEventInit inputEventInitDict)]
interface InputEvent : UIEvent {
};
dictionary InputEventInit : UIEventInit {
DOMString data = "";
boolean isComposing = false;
};