Document#

Document.createEvent()#

Metoda createEvent() tworzy nowe zdarzenie (tzw. niezaufane zdarzenie) o określonym ogólnym interfejsie zdarzenia dla danego dokumentu.

Opis działania#

Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
var new_event = document.createEvent(interface);

gdzie poszczególne człony oznaczają:

Algorytm wywołania metody createEvent(interface) nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:

  1. Niech constructor będzie wartością null.
  2. Jeśli interface pasuje pod względem nieczułości na wielkość znaków ASCII do któregokolwiek łańcucha znakowego w pierwszej kolumnie poniższej tabeli, to ustaw constructor na interfejs z drugiej kolumny tego samego wiersza, co dopasowany łańcuch znakowy:

    Łańcuch znakowyInterfejsUwagi
    "customevent"CustomEventSpecyfikacja DOM4 (bazowe interfejsy)
    "event"Event
    "events"
    "htmlevents"
    "keyboardevent"KeyboardEventSpecyfikacje D3E i UIE
    "mouseevent"MouseEvent
    "mouseevents"
    "uievent"UIEvent
    "uievents"
    "messageevent"MessageEventSpecyfikacja HTML5
    "touchevent"TouchEventSpecyfikacja Touch Events

    Wszystkie aktualne przeglądarki internetowe obsługują szerszy zestaw dopuszczalnych łańcuchów i niewykluczone, że w przyszłości powyższa lista ulegnie rozszerzeniu o nazwy implementowane przez wiodące silniki (Mozilla - Bug 1251198, Chromium - Bug 569690, WebKit - Bug 103423).

  3. Jeśli constructor ma wartość null, to zrzuć wyjątek "NotSupportedError".
  4. Niech event będzie rezultatem tworzenia zdarzenia poprzez wywołanie interfejsu constructor w roli konstruktora, z domyślnymi wartościami i argumentem w postaci pustego łańcuch znakowego.
  5. Usuń flagę inicjalizacji w event.
  6. Zwróć event.

Nowe zdarzenie zwracane przez metodę createEvent() ma ustawiane domyślne wartości dla wszystkich swoich właściwości. Ponadto nie może zostać wysłane za pomocą metody EventTarget.dispatchEvent() dopóty, dopóki nie zostanie zainicjowane za pomocą metody Event.initEvent() lub analogicznej metody właściwej dla konkretnego interfejsu zdarzenia. Zdarzenia tworzone wprost z konstruktora new Event(), i pochodnych, są inicjowane automatycznie. Także wszystkie zaufane zdarzenia są inicjowane automatycznie przez daną implementację.

Ze względów bezpieczeństwa wszystkie zdarzenia generowane po stronie kodu JS bezpośrednio przez programistę, np. przy użyciu metody createEvent() czy też dedykowanego konstruktora, muszą ustawiać wartość właściwości Event.isTrusted na boolowskie false.

Obiekt zwracany przez metodę createEvent() implementuje interfejs Event (lub inny bardziej wyspecjalizowany interfejs dziedziczący po nim), dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).

W ramach uzupełnienia najlepiej samodzielnie przeanalizować wady i zalety poszczególnych mechanizmów odpowiedzialnych za tworzenie niezaufanych zdarzeń bezpośrednio przez programistę.

Prosty przykład:

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
<!DOCTYPE html>
<html>

<head>

	<script>

		function createEvt(interface){

			function getInfoEvt(whatEvt){

				info.innerHTML = "Interfejs zdarzenia: " + whatEvt
					+ "<br>" + "Argument z metody: " + interface
					+ "<br><br>" + "Właściwość type: " + whatEvt.type
					+ "<br>" + "Właściwość bubbles: " + whatEvt.bubbles
					+ "<br>" + "Właściwość cancelable: " + whatEvt.cancelable
					+ "<br>" + "Właściwość defaultPrevented: " + whatEvt.defaultPrevented
					+ "<br>" + "Właściwość isTrusted: " + whatEvt.isTrusted
					+ "<br>" + "Właściwość eventPhase: " + whatEvt.eventPhase
					+ "<br>" + "Właściwość timeStamp: " + whatEvt.timeStamp
					+ "<br>" + "Właściwość currentTarget: " + whatEvt.currentTarget
					+ "<br>" + "Właściwość target: " + whatEvt.target + "<br><br>";

				try{
					window.dispatchEvent(whatEvt);
				}
				catch(e){

					info.innerHTML += "Wysłanie niezainicjowanego zdarzenia utworzonego metodą createEvent() zrzuca błąd:"
						+ "<br>" + e // opis zależny od przeglądarki
						+ "<br>" + e.constructor; // function DOMException() { [native code] }

				}

			}

			var info = document.getElementById("info");

			try{

				var newEvt = document.createEvent(interface);
				getInfoEvt(newEvt);

			}
			catch(e){

				info.innerHTML = "Przekazanie do metody createEvent() nieobsługiwanego interfejsu '" + interface + "' zrzuca błąd:"
					+ "<br>" + e // opis zależny od przeglądarki
					+ "<br>" + e.constructor; // function DOMException() { [native code] }

			}

		}

	</script>

</head>

<body>
	<p>Kliknij konkretny przycisk by utworzyć standardowe zdarzenie o określonym interfejsie zdarzenia:</p>
	<input type="button" value="createEvent('event')" onclick="createEvt('event')">
	<input type="button" value="createEvent('events')" onclick="createEvt('events')">
	<input type="button" value="createEvent('htmlevents')" onclick="createEvt('htmlevents')">
	<input type="button" value="createEvent('customevent')" onclick="createEvt('customevent')">
	<input type="button" value="createEvent('mouseevent')" onclick="createEvt('mouseevent')">
	<input type="button" value="createEvent('mouseevents')" onclick="createEvt('mouseevents')">
	<input type="button" value="createEvent('mouseevents')" onclick="createEvt('mouseevents')">
	<input type="button" value="createEvent('keyboardevent')" onclick="createEvt('keyboardevent')">
	<input type="button" value="createEvent('uievent')" onclick="createEvt('uievent')">
	<input type="button" value="createEvent('uievents')" onclick="createEvt('uievents')">
	<input type="button" value="createEvent('messageevent')" onclick="createEvt('messageevent')">

	<p>Zdarzenie dostępne tylko w przeglądarkach dotykowych (lub z trybem emulacji dotyku):</p>
	<input type="button" value="createEvent('touchevent')" onclick="createEvt('touchevent')">

	<p>Kilka niestandardowych nazw dla zdarzeń:</p>
	<input type="button" value="createEvent('keyevents')" onclick="createEvt('keyevents')">
	<input type="button" value="createEvent('DragEvent')" onclick="createEvt('DragEvent')">
	<input type="button" value="createEvent('CompositionEvent')" onclick="createEvt('CompositionEvent')">
	<input type="button" value="createEvent('HashChangeEvent')" onclick="createEvt('HashChangeEvent')">
	<input type="button" value="createEvent('MutationEvent')" onclick="createEvt('MutationEvent')">
	<input type="button" value="createEvent('StorageEvent')" onclick="createEvt('StorageEvent')">
	<input type="button" value="createEvent('TextEvent')" onclick="createEvt('TextEvent')">

	<p>Zmyślone nazwy dla zdarzenia:</p>
	<input type="button" value="createEvent('źdźbło')" onclick="createEvt('źdźbło')">
	<input type="button" value="createEvent('')" onclick="createEvt('')">

	<p style="color: blue;">Szczegółowe informacje o nowym zdarzeniu:</p>
	<p id="info"></p>
</body>

</html>

W poprzedniej specyfikacji metoda createEvent() definiowana była w specjalnym interfejsie DocumentEvent, ale z dopiskiem, że powinna być implementowana bezpośrednio w interfejsie Document.

Składnia Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
interface Document : Node {
	[NewObject] Event createEvent(DOMString interface);
};

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Document (H1) Document.createEvent() (H2) Opis działania (H3) Składnia Web IDL (H3) Specyfikacje i inne materiały (H3)