Eu li que o Safari para celular tem um atraso de 300 ms em eventos de clique desde o momento em que o link / botão é clicado até o momento em que o evento é disparado. O motivo do atraso é esperar para ver se o usuário pretende clicar duas vezes, mas de uma perspectiva de UX, esperar 300 ms geralmente é indesejável.
Uma solução para eliminar esse atraso de 300 ms é usar o manuseio de "tap" do jQuery Mobile. Infelizmente, não estou familiarizado com esta estrutura e não quero carregar uma estrutura grande se tudo que eu preciso é uma linha ou duas de código aplicado touchend
da maneira certa.
Como muitos sites, meu site tem muitos eventos de clique como este:
$("button.submitBtn").on('click', function (e) {
$.ajaxSubmit({... //ajax form submisssion
});
$("a.ajax").on('click', function (e) {
$.ajax({... //ajax page loading
});
$("button.modal").on('click', function (e) {
//show/hide modal dialog
});
e o que eu gostaria de fazer é me livrar do atraso de 300 ms em TODOS os eventos de clique usando um único snippet de código como este:
$("a, button").on('tap', function (e) {
$(this).trigger('click');
e.preventDefault();
});
Isso é uma ideia boa / ruim?
fonte
Respostas:
Agora, alguns navegadores móveis eliminam 300 ms de atraso de clique se você definir a janela de visualização. Você não precisa mais usar soluções alternativas.
Atualmente é compatível com Chrome para Android , Firefox para Android e Safari para iOS
No entanto, no iOS Safari , o toque duplo é um gesto de rolagem em páginas que não podem ser alteradas. Por esse motivo, eles não podem remover o atraso de 300ms . Se eles não puderem remover o atraso nas páginas que podem ser ampliadas, é improvável que o removam nas páginas que podem ser ampliadas.Telefones Windows também retêm o atraso de 300 ms em páginas não zeráveis, mas eles não têm um gesto alternativo como o iOS, então é possível para eles removerem esse atraso como o Chrome fez.Você pode remover o atraso no Windows Phone usando:Fonte: http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away
ATUALIZAÇÃO dezembro de 2015
Até agora, o WebKit e o Safari no iOS tinham um atraso de 350 ms antes que toques simples ativassem links ou botões para permitir que as pessoas ampliassem as páginas com um toque duplo. O Chrome mudou isso há alguns meses, usando um algoritmo mais inteligente para detectar isso e o WebKit seguirá com uma abordagem semelhante . O artigo oferece alguns insights excelentes sobre como os navegadores funcionam com gestos de toque e como os navegadores ainda podem ficar muito mais inteligentes do que são hoje.
ATUALIZAÇÃO março de 2016
No Safari para iOS, o tempo de espera de 350 ms para detectar um segundo toque foi removido para criar uma resposta de “toque rápido”. Isso é habilitado para páginas que declaram uma janela de visualização com width = device-width ou user-scalable = no. Os autores também podem optar pelo comportamento do toque rápido em elementos específicos usando o CSS
touch-action: manipulation
conforme documentado aqui (role para baixo até o título 'Comportamento do toque rápido do estilo') e aqui .fonte
Este plugin -FastClick desenvolvido pelo Financial Times faz isso perfeitamente para você!
Certifique-se de adicionar
event.stopPropagation();
e / ouevent.preventDefault();
diretamente após a função de clique, caso contrário, ela pode ser executada duas vezes da mesma forma que para mim, ou seja:fonte
fastclick
faz sua mágica apenas em dispositivos de toque que têm um problema de atraso (caso contrário, ele é automaticamente ignorado ). No entanto, simplesmente adicionarstopPropagation
&preventDefault
após cada evento de clique pode ter um efeito colateral indesejado em todos os manipuladores de eventos em todos os navegadores.Eu sei que isso é antigo, mas você não pode simplesmente testar para ver se "touch" é compatível com o navegador? Em seguida, crie uma variável que seja "touchend" ou "click" e use essa variável como o evento que é vinculado ao seu elemento.
Portanto, esse exemplo de código verifica se o evento "touchend" é compatível com o navegador e, caso contrário, usamos o evento "click".
(Editar: mudou "touchend" para "ontouchend")
fonte
Encontrei uma alternativa extremamente popular chamada Hammer.js (página do Github) que acho que é a melhor abordagem.
Hammer.js é uma biblioteca de toque com mais recursos (tem muitos comandos de deslizamento) do que Fastclick.js (resposta mais votada).
Porém, tenha cuidado: a rolagem rápida em dispositivos móveis tende a realmente travar a IU quando você usa o Hammer.js ou Fastclick.js. Esse é um grande problema se o seu site tiver um feed de notícias ou uma interface em que os usuários rolarão muito (pareceria a maioria dos aplicativos da web). Por esse motivo, não estou usando nenhum desses plug-ins no momento.
fonte
De alguma forma, desativar o zoom parece desativar esse pequeno atraso. Faz sentido, já que o toque duplo não é mais necessário.
Como posso "desativar" o zoom em uma página da web para celular?
Mas esteja ciente do impacto na usabilidade que isso terá. Pode ser útil para páginas da web projetadas como aplicativos, mas não deve ser usado para páginas 'estáticas' de uso mais geral IMHO. Eu o uso para um projeto de estimação que precisa de baixa latência.
fonte
Infelizmente, não existe uma maneira fácil de fazer isso. Portanto, apenas usar
touchstart
outouchend
deixará você com outros problemas, como alguém que começa a rolar ao clicar em um botão, por exemplo. Usamos o zepto por um tempo e, mesmo com esse framework muito bom, alguns problemas surgiram com o tempo. Muitos deles estão fechados , mas parece que não é um campo de solução simples.Temos esta solução para lidar globalmente com cliques em links:
fonte
tap
solução geral que postei e fatorar ostap
eventos elemento por elemento?tap
solução sozinho. Vou atualizar minha resposta.tap
solução geral seria igual à sua neste caso?Procurei uma maneira fácil sem jquery e sem biblioteca fastclick. Isso funciona para mim:
fonte
Apenas para fornecer algumas informações extras.
No iOS 10, os
<button>
s na minha página não podiam ser acionados continuamente. Sempre havia um atraso.Tentei fastclick / Hammer / tapjs / substituindo click por touchstart, todos falharam.
ATUALIZAÇÃO: a razão parece ser que o botão está muito próximo da borda! mova-o para perto do centro e o atraso se foi!
fonte
Você deve declarar explicitamente o modo passivo :
fonte
No jQuery você pode vincular o evento "touchend", que dispara o código imediatamente após o toque (é como uma tecla no teclado). Testado nas versões atuais dos tablets Chrome e Firefox. Não se esqueça do "clique" também para seus laptops com tela de toque e dispositivos de desktop.
fonte