2013-04-26 10 views
14

Czy istnieje sposób określenia, czy dana funkcja jest wywoływana w wyniku zdarzenia rodzimej przeglądarki?określić, czy funkcja wywołana w wyniku zdarzenia przeglądarki macierzystej

W nowoczesnych przeglądarkach, jeśli wywołasz funkcję window.open(...) z łańcucha zasięgu, który powstał za pomocą obsługi kliknięcia, strona otworzy się bez problemu.

Jeśli jednak spróbujesz wywołać to bezpośrednio, przeglądarka wygeneruje wyskakujące ostrzeżenie.

Przeglądarka śledzi kontekst wykonania i w jakiś sposób zaznacza go, aby pierwsze użycie funkcji powiodło się. Bez obecności tej flagi blokuje ona drugie użycie.

Czy istnieje sposób, aby uzyskać dostęp do tej flagi, aby wewnętrznie zablokować wykonywanie niektórych funkcji, jeśli są one wywoływane bezpośrednio w porównaniu do rzeczywistego zdarzenia przeglądarki macierzystej.

Przyjrzałem się obiektowi zdarzenia, które otrzymują moje funkcje, ale nie widzę niczego, co różni się rzeczywistym rodzimym wydarzeniem od zdarzenia generowanego przez ręczne wywołanie zdarzenia.

Czy to, czego chcę, jest możliwe?

+1

Domyślam się, że najlepsze, co można uzyskać, to przekazanie obiektu zdarzenia jako argumentu. Ale potem znowu * możesz * generować obiekty zdarzeń i nie ma możliwości odróżnienia prawdziwych zdarzeń od wygenerowanych. – MaxArt

Odpowiedz

7

Specyfikacja zdarzenia DOM Level 3 wprowadziła isTrusted property na obiektach zdarzeń. Ta właściwość jest ustawiona na true, gdy zdarzenie jest generowane w wyniku działania użytkownika i false, gdy zostało utworzone, na przykład poprzez createEvent:

zdarzeń, które zostały wygenerowane przez agenta użytkownika, albo w wyniku działania użytkownika, albo bezpośrednio w wyniku zmian w DOM są zaufane agenta użytkownika z uprawnieniami, które nie zyskują na zdarzenia generowane przez skrypt za pomocą metody DocumentEvent.createEvent("Event"), zmodyfikowane przy użyciu metody Event.initEvent() lub wywoływane za pomocą metody EventTarget.dispatchEvent().

Obecnie wydaje się, że tylko IE9 + i Firefox obsługują tę właściwość. Oto working example (oczywiście musisz uruchomić go w jednym z obsługiwanych przeglądarek):

var elem = document.getElementById("example"); 
elem.addEventListener("click", function (e) { 
    alert(e.isTrusted); 
}, false); 

var evt = document.createEvent("MouseEvents"); 
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
elem.dispatchEvent(evt); 

To będzie ostrzegać false po symulowanym atakiem jest zwolniony od razu, a true dowolnym momencie rzeczywiście kliknij na elemencie .

+1

Cóż, to zdecydowanie dobra wiadomość. Mam nadzieję, że Chrome (i ogólnie Webkit) pójdzie śladem FF i IE. – MaxArt

+0

Dobrze wiedzieć! :-) –

Powiązane problemy