Tak, natknąłem się na interesujący problem podczas pracy nad aplikacją internetową dla Microsoft Surface.Słuchanie mousedown I touchstart na urządzeniach, które używają dotyku i myszy (np. Surface)
Chcę dodać detektory zdarzeń, gdy użytkownik wejdzie w interakcję z elementem DOM. Teraz mogę zrobić:
if ('ontouchstart' in document.documentElement) {
//Attach code for touch event listeners
document.addEventListener("touchstart" myFunc, false);
} else {
//Attach code for mouse event listeners
document.addEventListener("mousedown" myFunc, false);
}
Jeśli urządzenie nie ma wejścia myszy, problem ten byłby prosty i powyższy kod działałby dobrze. Ale Surface (i wiele nowych komputerów z Windows 8) ma ZARÓWNO dotykiem i myszą. Powyższy kod zadziała tylko wtedy, gdy użytkownik dotknie urządzenia. Słuchacze zdarzeń myszy nigdy nie zostaną dołączeni.
Więc pomyślałem, dobrze, mogę to zrobić:
if ('ontouchstart' in document.documentElement) {
//Attach code for touch event listeners
document.addEventListener("touchstart" myFunc, false);
}
//Always attach code for mouse event listeners
document.addEventListener("mousedown" myFunc, false);
urządzeń, które nie obsługują dotyk nie miałyby wydarzenia związane, ale urządzenie, które wykorzystuje dotyk zarejestruje swoje ładowarki. Problem z tym jest jednak, że myFunc()
zostanie wywołana dwukrotnie na dotykowym urządzenia:
myFunc()
będzie ogień, gdy „touchstart” jest podniesiony- Ponieważ przeglądarki dotykowe zazwyczaj przejść przez cykl touchstart ->touchmove ->touchend ->mouseDown ->mousemove ->mouseUp ->kliknięcie,
myFunc()
zostanie ponownie wezwany "mousedown"
mam uznać dodanie kodu do myFunc()
taki sposób, że wywołuje ona e.preventDefault()
ale to wydaje się również zablokować touchend jak również mouseDown/mousemove/mouseUp w niektórych przeglądarkach (link).
Nienawidzę robić snifferów useragent, ale wygląda na to, że przeglądarki dotykowe różnią się sposobem implementacji zdarzeń dotykowych.
Pewnie czegoś mi brakuje, bo wydaje się, że z pewnością te implementacje JavaScript zostały zdecydowane z możliwością przeglądarki obsługującej zarówno mysz jak i dotyk!
Co to ma wspólnego z Androidem, biorąc pod uwagę, że Surface nie uruchamia Androida? – CommonsWare
@CommonsWare - Moje pytanie dotyczy wszystkich urządzeń dotykowych obsługujących mysz, dlatego wydaje się mieć zastosowanie w systemach Windows 8 i Android. – userx
Tak, a co z ChromeOS? –