2012-03-11 19 views
10

Mobilne przeglądarki symulują zdarzenia myszy, aby obsługiwać witryny internetowe, które dołączają jedynie programy obsługi do zdarzeń myszy. Jeśli jednak chcesz zaimplementować dwa modele interakcji - jeden dla zdarzeń myszy i jeden dla zdarzeń dotyku - to pomocne jest uniemożliwienie przeglądarce symulowania zdarzeń myszy.Jak zapobiegać symulowanym zdarzeniom myszy w przeglądarkach mobilnych?

iOS Safari to jest dość proste - wystarczy uruchomić preventDefault na touchend:

jQuery(document).on('touchend', function(e) { 
    // Do some logic  
    e.preventDefault(); 
}); 

To całkiem rozsądny. Niestety ani domyślna przeglądarka Androida, ani Dolfin nie anulują symulacji myszy za pomocą tej techniki. (Dolfin zrezygnuje z mousedown, gdy preventDefault zostanie uruchomiony na dotknięciu dotykowym - ale to nie jest zbyt pomocne, ponieważ nie wiesz, jaką akcję podejmie palec na touchstart.)

Czy jest jakiś inny sposób warunkowania, czy też nie warunkowego , zapobieganie strzelaniu symulowanym zdarzeniom myszy?

[EDIT]

Aby zacząć rozumieć problem (y) lepiej, zacząłem się zdarzenia dotykowe zgodności stolik w: http://labs.cruncher.ch/touch-events-compatibility-table/

+0

Bardzo doceniane są również komentarze z doświadczenia z mobilnym Chrome lub FF. – stephband

+2

Czy możesz wykryć, czy jest to przeglądarka mobilna, czy nie, przed podłączeniem zdarzeń myszy? –

+0

@JaredFarrish Metody wykrywania przeglądarki mobilnej nigdy nie są w 100% dokładne. –

Odpowiedz

3

Chociaż istnieją pewne przebiegli sposoby osiągnięcia tego celu, istnieją dwa wspólne praktyki, które mogę używać do poruszania się po tej rozbieżności:

1) Użyj flagi

Ustawianie logicznych flagi w swoim obsługi zdarzeń, takich jak mouseIsDown lub mouseIsMoving, można ustawić i sprawdzić pod kątem zdarzeń myszy i dotyku. Jeśli użytkownik kliknie myszą, zaakceptuj to jako zdarzenie myszy. Następnie, jeśli zdarzenie dotykowe występuje wraz z nim, zignoruj ​​go.

2) Wdrożenie tylko to, co jest konieczne

No to jest dobra praktyka w każdym razie. Jeśli nie potrzebujesz, nie przejmuj się dodawaniem zdarzeń touchmove i mousemove. Po prostu utrudni to utrzymanie kodu. Edycja: prawdopodobnie powinna być bardziej szczegółowa: rozważ przemyślenie swojego interfejsu, jeśli potrzebujesz bardziej zaawansowanego śledzenia zdarzeń.

Na koniec nie należy polegać na zewnętrznych listach konfiguracji sprzętu, ponieważ są one rzadko "całkowicie" dokładne.

+0

Czy Twoja pierwsza sugestia mówi zasadniczo "$ (document.body).mousemove() ', który ustawiłby flagę globalną, a następnie zostałby usunięty, i który byłby używany w każdym zdarzeniu' mouse -', aby wykryć obecność myszy? –

+0

1) Problem z symulowanymi zdarzeniami polega najpierw na zdarzeniu dotykowym, a następnie na zdarzeniach myszy - a więc do czasu zdarzenia myszy, zdarzenie dotykowe jest już zakończone. Po drugie, przechowywanie stanu takiego jak ten może być bardzo owłosione (w zależności od tego, co robisz) w przypadku wielokrotnego dotknięcia. Staram się nie przechowywać stanu, kiedy tylko jest to możliwe. Po trzecie, chcę poradzić sobie z kodem, który jest już napisany do używania zdarzeń myszy - nie chcę wchodzić w te wszystkie procedury obsługi i wstawiać kod, który warunkowo pyta, czy jesteśmy w interfejsie dotykowym. Doceniam twoją odpowiedź! – stephband

+0

Myślę też, że twoja druga nie jest tak naprawdę innym podejściem, to tylko dobra praktyka. Twoja prawdziwa odpowiedź jest pierwsza, a druga to przypomnienie, aby dokładnie przemyśleć to, czego naprawdę potrzebujesz (zawsze dobra rada). –

Powiązane problemy