Touchend JavaScript versus dilema de cliques

Estou trabalhando em uma interface de usuário javascript e usando muitos eventos de toque como 'touchend' para melhorar a resposta em dispositivos de toque. No entanto, existem alguns problemas lógicos que estão me incomodando ...

Vi que muitos desenvolvedores misturam 'touchend' e 'click' no mesmo evento. Em muitos casos, não vai doer, mas essencialmente a função dispara duas vezes em dispositivos de toque:

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

Foi sugerido que se pudesse detectar a capacidade de toque e definir o evento adequadamente, por exemplo:

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

O problema com o exposto acima é que ele será interrompido em dispositivos compatíveis com toque e mouse. Se o usuário estiver usando o mouse em um dispositivo de entrada dupla, o 'clique' não será acionado porque apenas 'touchend' está atribuído ao botão.

Outra solução é detectar o dispositivo (por exemplo, "iOS") e atribuir um evento com base nisso:Evento de clique chamado duas vezes no touchend no iPad. Obviamente, a solução no link acima é apenas para iOS (não Android ou outros dispositivos) e parece mais um "hack" para resolver algo bastante elementar.

Outra solução seria detectar o movimento do mouse e combiná-lo com a capacidade de toque para descobrir se o usuário está usando o mouse ou o toque. É claro que o problema é que o usuário pode não estar movendo o mouse a partir de quando você deseja detectá-lo ...

A solução mais confiável que consigo pensar é usar um simplesrebater para garantir que a função seja acionada apenas uma vez em um curto intervalo (por exemplo, 100 ms):

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

Estou faltando alguma coisa ou alguém tem alguma sugestão melhor?

Editar: Encontrei este link após o meu post, o que sugere uma solução semelhante à anterior:Como vincular os eventos 'touchstart' e 'click', mas não responder a ambos?

questionAnswers(5)

yourAnswerToTheQuestion