JavaScript touchend versus dilema de clics

Estoy trabajando en una interfaz de usuario de JavaScript y estoy usando muchos eventos táctiles como 'touchend' para mejorar la respuesta en dispositivos táctiles. Sin embargo, hay algunos problemas lógicos que me están molestando ...

He visto que muchos desarrolladores mezclan 'touchend' y 'click' en el mismo evento. En muchos casos no dolerá, pero esencialmente la función se dispararía dos veces en dispositivos táctiles:

button.on('click touchend', function(event) {
  // this fires twice on touch devices
});

Se ha sugerido que uno podría detectar la capacidad táctil y establecer el evento de manera apropiada, por ejemplo:

var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
  // this fires only once regardless of device
});

El problema con lo anterior es que se romperá en dispositivos que admitan tanto el tacto como el mouse. Si el usuario utiliza actualmente el mouse en un dispositivo de doble entrada, el 'clic' no se disparará porque solo se asigna 'toque' al botón.

Otra solución es detectar el dispositivo (por ejemplo, "iOS") y asignar un evento basado en eso:Haga clic en el evento llamado dos veces en touchchend en iPad. Por supuesto, la solución en el enlace anterior es solo para iOS (no Android u otros dispositivos), y parece más un "hack" para resolver algo bastante elemental.

Otra solución sería detectar el movimiento del mouse y combinarlo con la capacidad táctil para determinar si el usuario está en el mouse o táctil. El problema, por supuesto, es que el usuario podría no mover el mouse desde cuando desea detectarlo ...

La solución más confiable que se me ocurre es usar un simplerebotar para asegurarse de que la función solo se activa una vez dentro de un intervalo corto (por ejemplo, 100 ms):

button.on('click touchend', $.debounce(100, function(event) {
  // this fires only once on all devices
}));

¿Me estoy perdiendo algo o alguien tiene mejores sugerencias?

Editar: Encontré este enlace después de mi publicación, que sugiere una solución similar a la anterior:¿Cómo vincular los eventos 'touchstart' y 'click' pero no responder a ambos?

Respuestas a la pregunta(5)

Su respuesta a la pregunta