Event#

Event.isTrusted#

Właściwość isTrusted zwraca boolowską wartość true jeśli dane zdarzenie jest zaufane, w przeciwnym razie zwrócona zostanie wartość false (zdarzenie jest syntetyczne). Właściwość jest tylko do odczytu.

Składnia#

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 trusted = event.isTrusted;

gdzie poszczególne człony oznaczają:

Przy tworzeniu zdarzenia wartością domyślną dla właściwości isTrusted musi być boolowskie false.

Zaufane zdarzenia będą generowane jedynie przez aplikacje klienckie w odpowiedzi na zachowania użytkowników, z kolei zdarzenia syntetyczne można tworzyć samodzielnie z poziomu skryptu.

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>

		// Uruchom po całkowitym załadowaniu dokumentu
		window.onload = function(){

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

			button.addEventListener("click", function(e){

				info.innerHTML += "Interfejs zdarzenia e: " + e // [object MouseEvent]
					+ "<br>" + "e.type: " + e.type // click
					+ "<br>" + "e.bubbles: " + e.bubbles // true
					+ "<br>" + "e.cancelable: " + e.cancelable // true
					+ "<br>" + "e.defaultPrevented: " + e.defaultPrevented // false
					+ "<br>" + "e.isTrusted: " + e.isTrusted // true
					+ "<br>" + "e.eventPhase: " + e.eventPhase // 2
					+ "<br>" + "e.timeStamp: " + e.timeStamp // liczba całkowita z wartością zależną od chwili uruchomienia przykładu
					+ "<br>" + "e.currentTarget: " + e.currentTarget // [object HTMLInputElement]
					+ "<br>" + "e.target: " + e.target; // [object HTMLInputElement]

				e.preventDefault();

				info.innerHTML += "<br><br>" + "e.defaultPrevented: " + e.defaultPrevented; // true

			}, false);

			window.addEventListener("click", function(e){

				info.innerHTML += "<br><br>" + "Interfejs zdarzenia e: " + e // [object MouseEvent]
					+ "<br>" + "e.currentTarget: " + e.currentTarget // [object Window]
					+ "<br>" + "e.target: " + e.target // [object HTMLInputElement]
					+ "<br>" + "e.timeStamp: " + e.timeStamp; // liczba całkowita z wartością zależną od chwili uruchomienia przykładu

			}, false);

		}

	</script>

</head>

<body>

	<p>Kliknij w przycisk by uzyskać szczegółowe informacje dla zdarzenia.</p>
	<input id="press" type="button" value="Kliknij mnie!">

	<p style="color: blue;">Szczegółowe informacje dla przechwyconego zdarzenia:</p>
	<p id="info"></p>

</body>

</html>

Warto podkreślić, że w definicji Web IDL dla właściwość isTrusted pojawia się atrybut rozszerzający [Unforgeable]. Informuje on, że właściwość isTrusted obiektu nie może zostać w jakikolwiek sposób zmieniona, i dodatkowo powinna ona znajdować się w samej instancji obiektu, a nie w jego prototypie.

W DOM4 dodatkowy atrybut [Unforgeable] występuje jedynie dla właściwości isTrusted w obiektach zdarzeń. Jego zdefiniowanie podyktowane jest względami bezpieczeństwa. Zmiana wartości isTrusted jest całkowicie niedopuszczalna, czego nie gwarantuje klasyczny atrybut readonly. Problem ten już dawno zauważył John Resig, ale nie wiedzieć czemu został zlekceważony. Dopiero kolejne zgłoszenie zagrożenia przyniosło rozwiązanie w postać dodatkowego atrybutu.

Poniższy przykład prezentuje kilka techniki tworzenia zdarzeń, dla których odczytujemy i próbujemy zmienić wartość właściwość isTrusted:

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

<head>

	<script>

		function simTrusted(event){

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

			info.innerHTML = "event.isTrusted: " + event.isTrusted
					+ "<br>" + "event.timeStamp: " + event.timeStamp;

		}

		function simClickMethod(){

			document.getElementById("target").click();

		}

		function simClickCreate(){

			var event = document.createEvent("Event");
			event.initEvent("click", true, true);
			document.getElementById("target").dispatchEvent(event);

		}

		function tryChange1(event){

			var event = document.createEvent("Event");
			event.initEvent("click", true, true);
			event.isTrusted = "true"; // bez żadnego efektu, ale przeglądarki błędu nie zgłaszają
			document.getElementById("target").dispatchEvent(event);

		}

		function tryChange2(event){

			var event = document.createEvent("Event");
			event.initEvent("click", true, true);

			// Operacja zabroniona - nowoczesne przeglądarki powinny zgłosić wyjątek TypeError
			Object.defineProperty(event, "isTrusted", {
				get: function() {return true;}
			});

			document.getElementById("target").dispatchEvent(event);

		}

		function tryChange3(event){

			var event = document.createEvent("Event");
			event.initEvent("click", true, true);

			// Operacja zabroniona - nowoczesne przeglądarki powinny zgłosić wyjątek TypeError
			event.__defineGetter__("isTrusted", function(){
				return true;
			});

			document.getElementById("target").dispatchEvent(event);

		}

	</script>

</head>

<body>

	<p>
		Kliknij w przycisk by wywołać procedurę obsługi dla zaufanego zdarzenia:
		<input id="target" type="button" value="Zaufane click" onclick="simTrusted(event)">
	</p>

	<p>
		Kliknij w przycisk by zasymulować kliknięcie przycisku za pomocą metody:
		<input type="button" value="Niezaufane click()" onclick="simClickMethod()">
	</p>

	<p>
		Kliknij w przycisk by utworzyć i wysłać sztuczne zdarzenie:
		<input type="button" value="Niezaufane createEvent()" onclick="simClickCreate()">
	</p>

	<p>
		Kliknij w przycisk by spróbować zmienić wartość isTrusted sztucznego zdarzenia za pomocą zwykłego przypisania:
		<input type="button" value="isTrusted = 'true'" onclick="tryChange1()">
	</p>

	<p>
		Kliknij w przycisk by spróbować zmienić wartość isTrusted sztucznego zdarzenia za pomocą metody ECMAScript5:
		<input type="button" value="defineProperty()" onclick="tryChange2()">
	</p>

	<p>
		Kliknij w przycisk by spróbować zmienić wartość isTrusted sztucznego zdarzenia za pomocą niestandardowej metody:
		<input type="button" value="__defineGetter__()" onclick="tryChange3()">
	</p>


	<p style="color: blue;">Szczegółowe informacje dla przechwyconego zdarzenia:</p>
	<p id="info"></p>

</body>

</html>

Na chwilę obecną jedynie przeglądarka Firefox i Opera obsługuje wszystko prawidłowo, włącznie z blokadą sztuczki przy użyciu ECMAScript5 lub niestandardowej metody __defineGetter__(). IE11 nie jest odporne na sztuczkę z ECMAScript5, także zdarzenia tworzone za pomocą metody click() traktuje jak zaufane, co nie wydaje się właściwe. Najgorzej wypada Chrome, które w ogóle nie obsługuje właściwości isTrusted.

Interfejs Web IDL#

  1. L
  2. K
  3. T'
  4. T
  5. A
  6. O
  7. Z'
  8. Z
  9. #
[Unforgeable] readonly attribute boolean isTrusted;

Specyfikacje i inne materiały#

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Event (H1) Event.isTrusted (H2) Składnia (H3) Interfejs Web IDL (H3) Specyfikacje i inne materiały (H3)