2013-04-30 11 views
11

Zacznę od stwierdzenia, że ​​rozumiem, że poniższy kod ma poważny problem. W szczególności parametr event nie jest przekazywany do funkcji. Nie rozumiem, dlaczego w poniższym kodzie Chrome, Opera, Safari, Firefox i IE wszystkie traktują zmienną event inaczej.Nieoczekiwany dostęp do zmiennej "zdarzenia" w różnych przeglądarkach?

$('#eventBtn').on('click', function() { 
    console.log(event); 
    event.preventDefault(); 
}); 

W Chrome, Opera i Safari powyższy kod działa. IE kończy się niepowodzeniem na drugiej linii i Firefox natychmiast się zawiesza. Dla celów testowych stworzyłem nieco bardziej upiększony jsFiddle. Wyjście powyżej console.log(event) w różnych przeglądarkach:

Chrome Version 26.0.1410.64 m
MouseEvent {dataTransfer: null, toElement: button#superBtn, fromElement: null, y: 20, x: 33…}

Opera Version 12.15
MouseEvent

Safari Version 6.0.2 (8536.26.17)
MouseEvent

IE Version 10.0.9200.16540
[object MSEventObj]

Firefox Version 20.0.1
ReferenceError: event is not defined

byłem trochę o tej „funkcji” w Chrome, Opera i Safari, ponieważ pracował zgodnie z przeznaczeniem nie jest tak zakodowany tworząc nieoczekiwane zachowanie w innych przeglądarkach. Chociaż IE ma również globalną zmienną event, w przeciwieństwie do wyżej wymienionych przeglądarek nie przypisuje tej zmiennej do zdarzenia, które jest aktualnie uruchamiane. Firefox nie ma globalnej zmiennej event iw związku z tym ulega awarii, gdy tylko odwołuje się event.

Zazwyczaj używam e do reprezentowania zmiennych zdarzeń, które zgodnie z oczekiwaniami zawiodą w ten sam sposób we wszystkich przeglądarkach. Dlaczego Chrome, Opera i Safari mają globalną zmienną event przypisaną w ten sposób? Czy to zachowanie jest gdzieś udokumentowane? Oprócz tego, czy nie używasz event dla zmiennej, nazywając jakąkolwiek radę do radzenia sobie z tą "cechą"?

+0

Twoja funkcja nie bierze "zdarzenia" jako parametru, więc 'zdarzenie' nie powinno być zdefiniowane w kontekście funkcji. – nullability

+1

możliwy duplikat [jest zdarzeniem globalna zmienna, która jest dostępna wszędzie wewnątrz łańcucha oddzwaniania?] (Http://stackoverflow.com/questions/6426497/is-event-a-global-variable-that-is-accessible-everywhere -inside-the-callback-cha) – Barmar

+1

@nullability Taki jest sens jego pytania: nie spodziewał się, że zostanie on zdefiniowany, ale jest w większości przeglądarek. Zobacz pytanie, które właśnie podłączyłem dla wyjaśnienia. – Barmar

Odpowiedz

5

IE zawsze udostępnia globalną zmienną event, w przeciwieństwie do dyktowanych przez standardy W3C. Inne przeglądarki robią to samo, aby zapewnić kompatybilność wsteczną ze stronami stworzonymi w starych wersjach IE.

While IE also has a global event variable, unlike the aforementioned browsers it does not assign that variable to the event that is currently firing.

Uważam, że tak.

+0

Przynajmniej IE10 nie, chociaż nie testowałem zachowania w IE9 lub wcześniej. – ahsteele

+0

Hm, a następnie IE podąża za standardem, gdy nie jest w trybie zgodności; w przeciwieństwie do Chrome ... – bfavaretto

Powiązane problemy