2014-12-16 12 views
6

Próbuję zrozumieć, jak różne zdarzenia wskaźnika (dotyk, mysz) są uruchamiane w różnych przeglądarkach/na różnych urządzeniach. W tym celu napisałem niewielką stronę internetową do testowania wydarzeń http://tstr.29pixels.net.Różnica między zdarzeniem zdarzeń wskaźnika w jQuery a zwykłym JavaScriptem

Kilka tygodni później natknąłem się na stronę testową zdarzeń słuchacza Mozilli pod numerem http://mozilla.github.io/mozhacks/touch-events/event-listener.html, która dała bardzo różne wyniki (widziałem zdarzenia, które nie były wyświetlane w moim oryginalnym narzędziu testowym).

Obie strony używają różnych stylów wiążących wydarzeń, więc chciałbym wiedzieć, gdzie jest różnica w wiązaniu tych wydarzeń?

Na przykład podnieś swój tablet/smartfon za pomocą Chrome i spróbuj kliknąć przycisk w mojej sieci. W większości przypadków wystrzeliwane są dwa zdarzenia - dotykowy i dotykowy (z okazjonalnym dotknięciem dotykowym). Następnie wypróbuj narzędzie Mozilli. Jest o wiele więcej (nawet włączając kliknięcie).

My wiązania: wiązanie

$("#button").on('mouseenter mouseleave ... mousemove click', function(e){ 
    ... 
} 

Mozilla:

var events = ['MSPointerDown', 'MSPointerUp', ... , 'MSPointerCancel']; 
var b = document.getElementById('button'); 
for (var i=0; i<events.length; i++) { 
    b.addEventListener(events[i], report, false); 
} 

Są to tylko najważniejsze części, pełny kod javascript jest napisane w prawo na stronie indeksu obu stronach (to nie długo).

Jeśli ktoś mógłby mi w tym pomóc, byłbym bardzo wdzięczny.

Odpowiedz

2

jQuery również wewnętrznie używa addEventListener. W zależności od zdarzenia może być pewne odwzorowanie lub wewnętrzne poprawki wykonane przez jQuery.

Główna różnica między kodem a Mozillą polega na tym, że w metodzie wywołania zwrotnego wywołuje się e.preventDefault();, ale Mozilla nie zapobiega domyślnemu zachowaniu się zdarzenia.

Zadzwonienie pod numer e.preventDefault(); nie tylko zapobiegnie domyślnemu zachowaniu, ale także zapobiegnie wystąpieniu pewnych innych zdarzeń. na przykład jeśli uniemożliwisz wystąpienie zdarzenia mousedown lub mousemove nr drag.

+0

Dziękujemy! Usunąłem 'e.preventDefault()' (i zaktualizowałem nieco listę zdarzeń), a teraz mam te same wyniki co narzędzie Mozilla. Poczytaj więcej o działaniu 'e.preventDefault()'. –

+0

@ PavelAntolík Niestety obecnie nie znam opisu, który opisuje, w jaki sposób 'preventDefault' wpływa na inne zdarzenia. '[...] ale w wyniku tego zapobiegnie wystąpieniu pewnego innego zdarzenia." może być trochę mylące. Może to uniemożliwić zachowanie przeglądarki, a to zachowanie może skutkować innymi zdarzeniami. Zdarzenie 'click' na urządzeniach dotykowych jest emulowanym zdarzeniem, a jeśli zapobiegniesz zdarzeniu dotykowemu, domyślne zachowanie emulowania" kliknięcia "zostanie uniemożliwione. Ale szczerze mówiąc nie wiem, czy emulacja jest objęta standardem, czy też 'preventDefault' powinna temu zapobiec. –

0

Nie ma dużej różnicy w sposobie rejestrowania zdarzeń w przeglądarce.

Jednak Mozilla po prostu łączy swój program obsługi z wydarzeniami, których nie słuchasz. W szczególności są to:

MSGotPointerCapture MSLostPointerCapture MSPointerCancel 
blur focus 
gotpointercapture lostpointercapture pointercancel 
mousedown mouseup 
mouseout 
mouseover 
touchenter touchleave 
+0

Tak, wiem o tym. Ale moje narzędzie testowe nie pokazuje nawet zdarzeń, które spowodowałem DID (np. Kliknięcie) .. –

+0

Ah, i używasz urządzenia dotykowego (kliknięcie myszką działa dobrze).W takim przypadku twoje 'e.preventDefault()' (jak odnotowano przez @ t.niese) na 'touchend' (podobne do' mouseup') uniemożliwia działanie kliknięcia. – Bergi

+0

Tak, testuję to na około 8 urządzeniach, w tym na smartfonach, tabletach, hybrydach (tablet z klawiaturą i myszą) i na pulpicie. Brawo za różnorodność urządzeń -_- W każdym razie, dziękuję za szybką reakcję! –