Sto lavorando su alcune interfacce utente javascript e utilizzo di molti eventi di tocco come "touchend" per una migliore risposta sui dispositivi touch. Tuttavia, ci sono alcuni problemi logici che mi infastidiscono ...JavaScript touchend versus click dilemma
Ho visto che molti sviluppatori mischiano "tocco" e "clic" nello stesso evento. In molti casi non farà male, ma essenzialmente la funzione avrebbe sparato due volte su dispositivi touch:
button.on('click touchend', function(event) {
// this fires twice on touch devices
});
è stato suggerito che si potrebbe rilevare tocco capacità, e impostare l'evento in modo appropriato, ad esempio:
var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
// this fires only once regardless of device
});
Il problema di cui sopra, è che si romperà su dispositivi che supportano sia touch che mouse. Se l'utente sta attualmente utilizzando il mouse su un dispositivo a doppio ingresso, il "clic" non si attiva perché al pulsante viene assegnato solo "touchend".
Un'altra soluzione è rilevare il dispositivo (ad esempio "iOS") e assegnare un evento basato su quello: Click event called twice on touchend in iPad. Ovviamente, la soluzione nel link sopra è solo per iOS (non per Android o altri dispositivi), e sembra più un "hack" per risolvere qualcosa di abbastanza elementare.
Un'altra soluzione potrebbe essere quella di rilevare il movimento del mouse e combinarlo con la funzionalità touch per capire se l'utente è sul mouse o sul touch. Ovviamente il problema è che l'utente non stia spostando il mouse da quando lo si vuole rilevare ...
La soluzione più affidabile a cui posso pensare è quella di utilizzare una semplice funzione debounce per assicurarsi semplicemente che la funzione sia solo innesca una volta entro un breve intervallo (ad esempio 100 ms):
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
mi sto perdendo qualcosa, o qualcuno ha qualche suggerimento migliore?
Edit: Ho trovato questo link dopo il mio post, che suggerisce una soluzione simile a quanto sopra: How to bind 'touchstart' and 'click' events but not respond to both?
Questo non risolve nulla ... Modernizr rileva solo il "tocco". L'evento verrà comunque attivato due volte sui dispositivi touch. O se si assegna l'evento 'tocco' per dispositivi touch (tramite modernizr), smetterà di funzionare per gli utenti che utilizzano il mouse su dispositivi a doppio ingresso come molti dispositivi Windows8. – suncat100