Quindi, ho riscontrato un problema interessante mentre lavoravo a un'applicazione Web per Microsoft Surface.Ascolto di mouse e touchstart su dispositivi che utilizzano touch e mouse (ad esempio Surface)
Desidero aggiungere listener di eventi per quando un utente interagisce con un elemento DOM. Ora posso fare:
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);
}
Se il dispositivo non ha un input del mouse, questo problema sarebbe semplice e il codice sopra funzionerebbe perfettamente. Ma Surface (e molti nuovi computer Windows 8) hanno ENTRAMBI un tocco e l'input del mouse. Quindi il codice sopra funzionerebbe solo quando l'utente ha toccato il dispositivo. Gli ascoltatori di eventi del mouse non verrebbero mai collegati.
Allora ho pensato, beh, avrei potuto fare questo:
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);
dispositivi che non supportano tocco non avrebbe gli eventi collegati, ma un dispositivo che utilizza tocco registrerà i suoi gestori. Il problema di questo è però che myFunc()
sarà chiamato due volte su un dispositivo touch:
myFunc()
sparerà quando "TouchStart" è sollevata- Poiché i browser tocco tipicamente passano attraverso il ciclo TouchStart ->touchmove ->touchend ->mousedown ->mousemove ->mouseup ->click,
myFunc()
sarà chiamato di nuovo in "MouseDown"
Ho considerato l'aggiunta di codice a myFunc()
tale che chiama e.preventDefault()
ma questo sembra bloccare anche touchend così come mousedown/mousemove/mouseup su alcuni browser (link).
Odio fare sniffer useragent, ma sembra che i touch browser abbiano variazioni sul modo in cui vengono implementati gli eventi touch.
Mi manca qualcosa perché sembra che sicuramente queste implementazioni di JavaScript siano state decise con la possibilità di un browser che supporta sia mouse che touch!
Che cosa ha a che fare questo con Android, considerando che Surface non esegue Android? – CommonsWare
@CommonsWare - La mia domanda è pertinente a tutti i dispositivi touch che supportano anche un mouse, quindi sembra applicabile a Windows 8 e Android. – userx
Sì, che dire di chromeOS? –