Próbuję sprawić, by niektóre z moich bibliotek współpracowały z urządzeniami dotykowymi, ale ciężko mi jest dowiedzieć się, w jaki sposób są obsługiwane i jak działają.
Zasadniczo jest 5 zdarzeń dotykowych , ale wydaje się, że istnieje konsensus między przeglądarkami mobilnymi tylko w sprawie touchstart
wydarzenia (tak). Stworzyłem skrzypce jako przypadek testowy.
Przetestowałem to na moim Galaxy Note z Androidem 4 na pokładzie, ale możesz też sprawdzić link w przeglądarce na komputerze.
Celem jest próba zrozumienia, jak radzić sobie z dotknięciem, podwójnym i długim dotknięciem. Nic fajnego.
Zasadniczo dzieje się tak:
Przeglądarka giełdowa Androida nie uruchamia zdarzeń dotykowych. To właśnie próbuje naśladować kliknięć myszką z kranów, wypalanie mousedown
, mouseup
i click
wydarzeń kolejno, ale podwójne zawory tylko powiększać i pomniejszać tha strony.
Chrome na Androida uruchamia zdarzenie startu dotykowego, gdy palec dotyka ekranu. Jeśli jest wydany na tyle wcześnie, pożary następnie mousedown
, mouseup
, touchend
a na koniec click
imprezy.
W przypadku długiego kranu , po około pół sekundy pożary mousedown
i mouseup
, a touchend
gdy palec zostanie zniesione, bez click
wypadku na końcu.
Jeśli poruszysz palcem , touchmove
kilka razy wyzwala touchcancel
zdarzenie, po czym wyzwala zdarzenie, a potem nic się nie dzieje, nawet touchend
zdarzenie po podniesieniu palca.
A double tap wyzwala zoom in / out funkcji, ale wydarzenie mądry pożary kombi touchstart
- touchevent
dwa razy, bez żadnych zdarzeń myszy zwolniony.
Firefox dla Androida prawidłowo pożary touchstart
zdarzenia, aw przypadku krótkich pożarów kranu mousedown
, mouseup
, touchend
a click
potem.
W przypadku długiego kranu odpala mousedown
, mouseup
a na końcu touchend
zdarzenia. Tak samo jest z Chrome w przypadku tych rzeczy.
Ale jeśli poruszasz palcem , jeśli jest uruchamiany w sposób touchmove
ciągły (jak można się spodziewać), ale nie uruchamia touchleave
zdarzenia, gdy palec opuszcza element z detektorem zdarzeń, i nie uruchamia touchcancel
zdarzenia, gdy palec wyjdzie z widoku przeglądarki .
W przypadku dwukrotnego dotknięcia zachowuje się tak jak Chrome.
Opera Mobile robi to samo co Chrome i Firefox po krótkim dotknięciu, ale w przypadku długiego naciśnięcia aktywuje jakąś funkcję udostępniania, którą naprawdę chcę wyłączyć. Jeśli poruszysz palcem lub dwukrotnie dotknij, zachowuje się tak jak Firefox.
Chrome beta ma zwykle na krótkie krany, ale w przypadku długich kranów nie ognia mouseup
zdarzenie już, po prostu touchstart
, po czym mousedown
po pół sekundy, a touchend
gdy palec zostanie zniesione. Kiedy palec zostanie przesunięty, zachowuje się jak Firefox i Opera Mobile.
W przypadku podwójnego dotknięcia nie uruchamia zdarzeń dotykowych podczas pomniejszania , ale tylko podczas powiększania.
Chrome beta wykazuje najdziwniejsze zachowanie, ale nie mogę narzekać, ponieważ jest to wersja beta.
Pytanie brzmi : czy istnieje prosty i sposób na wykrycie krótkich, długich i podwójnych dotknięć w najpopularniejszych przeglądarkach urządzeń dotykowych?
Szkoda, że nie mogę go przetestować na urządzeniach iOS z Safari lub IE dla Windows Phone 7 / Phone 8 / RT, ale jeśli niektórzy z was mogą, Wasza opinia byłaby bardzo wdzięczna.
źródło
Odpowiedzi:
Jeśli jeszcze tego nie zrobiłeś, proponuję przeczytać kod źródłowy Hammer.js
https://github.com/hammerjs/hammer.js/blob/master/hammer.js
Pomiędzy komentarzami a kodem jest około 1400 linii, jest świetna dokumentacja, a kod jest łatwy do zrozumienia.
Możesz zobaczyć, w jaki sposób autor zdecydował się rozwiązać wiele typowych zdarzeń dotykowych:
Myślę, że po przeczytaniu kodu źródłowego znacznie lepiej zrozumiesz, jak działają zdarzenia dotykowe i jak zidentyfikować, które zdarzenia przeglądarka jest w stanie obsłużyć.
http://eightmedia.github.io/hammer.js/
źródło
Istnieje naprawdę doskonały zasób https://patrickhlauke.github.io/touch/tests/results/, który szczegółowo opisuje kolejność zdarzeń w oszałamiającej liczbie przeglądarek. Wydaje się również, że jest regularnie aktualizowany (we wrześniu 2016 r. Ostatnio zaktualizowano w sierpniu 2016 r.).
Istota jest taka, że zasadniczo wszystko wyzwala
mouseover
i powiązane zdarzenia; większość wyzwala również zdarzenia dotykowe, które zwykle kończą się (sięgajątouchend
) przed,mouseover
a następnie trwająclick
(chyba że zmiana treści strony anuluje to). Te niezręczne wyjątki są na szczęście stosunkowo rzadkie (przeglądarki Androida innych firm i poradnik na temat blackberry).Ten połączony zasób ma imponujący poziom szczegółowości. Oto przykład pierwszych trzech z wielu, wielu testów systemów operacyjnych, urządzeń i przeglądarek:
Podsumowując niektóre kluczowe punkty:
Przeglądarki mobilne
mouseover
się po pierwszym dotknięciu. Tylko niektóre przeglądarki Windows Phone wyzwalają go po drugim dotknięciu.click
. Nie określa, które anuluj,click
jeślimouseover
zmieni stronę (wydaje mi się, że większość to robi)mouseover
potouchstart
itouchend
. Obejmuje to iOS7.1 Safari, standardowe systemy Android, Chrome, Opera i Firefox na Androida i niektóre (nie wszystkie przeglądarki na Windows Phone)mouseover
potouchstart
itouchend
.mouseover
międzytouchstart
atouchend
touchstart
lubtouchend
.Przeglądarki komputerowe
touchstart
atouchend
za nimi podążająmouseover
.touchstart
itouchend
.touchstart
itouchend
biorąc pod uwagę niedobór interfejsów dotykowych w Macach.Istnieje również niesamowita ilość danych w przeglądarkach w połączeniu z technologiami pomocniczymi.
źródło
Tak, możesz uruchomić stoper o godzinie
touchstart
i zakończyć go,touchend
a następnie dokonać wyboru.Możesz także zrobić ... powiedzmy machnięcie, moje wyzwalanie
touchmove
możesz uzyskać współrzędne "palca" i zobaczyć, ile podróżowałem, zanimtouchend
zostanie wyzwolony.Nie wiem, czy istnieje prostszy sposób niż korzystanie z biblioteki zdarzeń dotykowych, ale przypuszczam, że można łatwo napisać jedną dla prostych zdarzeń „dotknięcia”, „dwukrotnego dotknięcia”, „przesunięcia”.
źródło
touchleave
nigdy nie jest uruchamiany.e.target
(jak sądzę) na touchstart, czy jest równy elementowi na touchstarcie? Jeśli nie, to nie jest prawidłowy kran, to pułapka. Nie mówię, że kodowanie biblioteki byłoby łatwe, ale nie jest tak naprawdę „trudne”, oceniłbym ją jako „średnią” + jaka jest frajda, jeśli nie stanowi wyzwania i sprawia, że wracamy na stackoverflow xDtouchstart
wydarzeniu? Co się stanie, jeśli wtouchstart
międzyczasie uruchomione zostanie drugie zdarzenie (wyświetlacz wielodotykowy)? Jak radzisz sobie z długimi kranami? UżywającsetTimeout
, ale co, jeśli palec w międzyczasie opuści element? Jak to wykryjesz, jeśli żadne zdarzenia dotykowe nie są wyzwalane? I tak dalej ... Spróbuję oczywiście, ale miałem nadzieję, że znajdę głęboką analizę wydarzeń dotykowych.touchstart
przed pierwszymtouchend
występuje. Co więcej, ponowne myślenie o Twojej odpowiedzi prowadzi do wniosku, że to nie pomoże, ponieważtarget
właściwośćtouchend
zdarzenia zawsze jest równa elementowi, w którym rozpoczął się dotyk, nawet jeśli palec został przesunięty poza element!Oto moje najnowsze obserwacje dotyczące zdarzeń dotyku i myszy w systemie Android 4.3
Wygląda na to, że Opera, Firefox i Chrome mają standardowe zachowanie
On Swipe (touchstart-touchmove-touchchend):
Po dotknięciu (touchstart-touchchend):
Domyślna przeglądarka Androida ma kilka niestandardowych zachowań :
źródło