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:
var trusted = event.isTrusted;
gdzie poszczególne człony oznaczają:
trusted
- boolowskietrue
lubfalse
.event
- zdarzenie będące obiektem kontekstu.
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:
<!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
:
<!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#
[Unforgeable] readonly attribute boolean isTrusted;