Eu tenho alguns sites que eu criei há tempos, que usam eventos jquery mouse ... Acabei de receber um ipad e notei que todo o mouse sobre eventos é traduzido em cliques ... então, por exemplo, eu tenho que fazer dois cliques em vez de um .. (a primeira focalização, que o clique real)
existe uma solução pronta para resolver isso? talvez um comando jquery que eu deveria ter usado em vez de mouseover / out etc. obrigado!
Respostas:
Ainda não testei isso completamente, mas como o iOS aciona eventos de toque, isso pode funcionar, desde que você esteja em uma configuração de jQuery.
A idéia é que o Mobile WebKit dispara um
touchend
evento no final de um toque, para que possamos ouvi-lo e redirecionar o navegador assim que umtouchend
evento for disparado em um link.fonte
.on
é preferível.live
. Depois de ler esta resposta, descobri que alterar meu código para$('a').on('click touchend', function(e) {...})
funciona de maneira excelente.target="_blank"
ele será aberto na mesma janela E em uma nova janela.Não está totalmente claro qual é a sua pergunta, mas se você deseja apenas eliminar o clique duplo, mantendo o efeito de foco do mouse, meu conselho é:
touchstart
emouseenter
.mouseleave
,touchmove
eclick
.fundo
Para simular um mouse, navegadores como o Webkit mobile acionam os seguintes eventos se um usuário tocar e soltar um dedo na tela de toque (como o iPad) (fonte: Touch And Mouse no html5rocks.com):
touchstart
touchmove
touchend
mouseover
mouseenter
mouseover
,mouseenter
oumousemove
evento muda o conteúdo da página, os seguintes eventos não são disparados.mousemove
mousedown
mouseup
click
Não parece possível simplesmente dizer ao navegador da web para pular os eventos do mouse.
O que é pior: se um evento de mouseover altera o conteúdo da página, o evento de clique nunca é acionado, conforme explicado no Guia de Conteúdo da Web do Safari - Manipulação de Eventos , em particular a figura 6.4 em Eventos com um dedo . O que exatamente é uma "alteração de conteúdo" depende do navegador e da versão. Descobri que, para o iOS 7.0, uma alteração na cor do plano de fundo não é (ou não é mais?).
Solução explicada
Para recapitular:
touchstart
emouseenter
.mouseleave
,touchmove
eclick
.Observe que não há ação no
touchend
!Isso claramente funciona para eventos de mouse:
mouseenter
emouseleave
(versões ligeiramente aprimoradas demouseover
emouseout
) são acionadas, e adicione e remova o foco.Se o usuário realmente for
click
um link, o efeito de foco instantâneo também será removido. Isso garante que ele seja removido se o usuário pressionar o botão Voltar no navegador da web.Isso também funciona para eventos de toque:
touchstart
o efeito de foco é adicionado. É '' 'não' '' removido emtouchend
. Ele é adicionado novamentemouseenter
e, como isso não causa alterações no conteúdo (já foi adicionado), oclick
evento também é acionado e o link é seguido sem a necessidade do usuário clicar novamente!Os 300 ms de atraso que um navegador possui entre um
touchstart
evento eclick
são realmente utilizados porque o efeito de foco será mostrado durante esse curto período de tempo.Se o usuário decidir cancelar o clique, um movimento do dedo fará o mesmo normalmente. Normalmente, isso é um problema, pois nenhum
mouseleave
evento é disparado e o efeito de foco permanece no lugar. Felizmente, isso pode ser facilmente corrigido removendo o efeito de foco emtouchmove
.É isso aí!
Observe que é possível remover o atraso de 300ms, por exemplo, usando a biblioteca FastClick , mas isso está fora do escopo desta pergunta.
Soluções alternativas
Encontrei os seguintes problemas com as seguintes alternativas:
touchend
: Isso seguirá incorretamente o link, mesmo se o usuário quiser apenas rolar ou ampliar, sem a intenção de realmente clicar no link.touchend
usada como condição if nos eventos subsequentes do mouse para impedir alterações de estado naquele momento. A variável é redefinida no evento click. Esta é uma solução decente se você realmente não deseja um efeito de foco instantâneo nas interfaces de toque. Infelizmente, isso não funciona se umtouchend
é acionado por outro motivo e nenhum evento de clique é acionado (por exemplo, o usuário rolou ou aumentou o zoom) e, posteriormente, tenta seguir o link com um mouse (ou seja, em um dispositivo com interface de mouse e touch) )Leitura adicional
mouseover
oumousemove
.Consulte também o problema de clique duplo do iPad / iPhone e Desativar efeitos de foco instantâneo em navegadores móveis .
fonte
Parece que existe uma solução CSS, afinal. O motivo pelo qual o Safari aguarda um segundo toque é devido à imagem (ou elementos) de plano de fundo que você normalmente atribui ao evento: hover. Se não houver nenhum para ser mostrado - você não terá problemas. A solução é direcionar a plataforma iOS com um arquivo CSS secundário (ou estilo no caso de uma abordagem JS) que substitua: passe o plano de fundo para herdar, por exemplo, e oculte os elementos que você exibiria ao passar o mouse:
Aqui está um exemplo de CSS e HTML - um bloco de produto com um rótulo com estrela no mouse sobre:
HTML:
CSS:
Solução (CSS secundário):
fonte
Não há necessidade de complicar demais.
fonte
O que funcionou para mim é o que os outros aqui já disseram:
Não mostre / oculte elementos em hover ou mousemove (que é o evento no meu caso).
Veja o que a Apple diz ( https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html ):
Portanto, você pode usar a solução do @ woop: detecte o userAgent, verifique se é um dispositivo iOS e ligue o evento. Acabei usando essa técnica porque atende às minhas necessidades e faz mais sentido não vincular eventos de foco quando você não deseja.
Mas ... se você não quiser mexer com userAgents e ainda ocultar / mostrar elementos em hover / mousemove, descobri que você pode fazer isso usando javascript nativo, assim:
Isso funcionará na versão Desktop e não fará nada na versão móvel.
E para um pouco mais de compatibilidade ...
fonte
A solução do cduruk foi bastante eficaz, mas causou problemas em algumas partes do meu site. Como eu já estava usando o jQuery para adicionar a classe de foco CSS, a solução mais fácil era simplesmente não adicionar a classe de foco CSS em dispositivos móveis (ou, mais precisamente, SOMENTE adicioná-la quando NÃO estiver em um dispositivo móvel).
Aqui estava a ideia geral:
* código reduzido para fins ilustrativos
fonte
Eu acho que seria sensato tentar
mouseenter
no lugar demouseover
. É o que é usado internamente ao vincular.hover(fn,fn)
e geralmente é o que você deseja.fonte
Eu tive os seguintes problemas com as soluções existentes e encontrei algo que parece resolver todas elas. Isso pressupõe que você está buscando algo entre navegadores, dispositivos e não deseja farejar dispositivos.
Os problemas que isso resolve
Usando apenas
touchstart
outouchend
:Desencadeando
mouseover
eventos dotouchstart
emouseout
notouchmove
tem consequências menos graves, mas não interfere com o comportamento habitual navegador, por exemplo:touchstart
como ummouseover
, que émouseout
editado a seguirtouchstart
. Uma maneira de ver o conteúdo do mouse no Android é, portanto, tocar na área de interesse e mexer o dedo, rolando a página levemente. Tratartouchmove
comomouseout
quebra isso.A solução
Em teoria, você pode simplesmente adicionar uma bandeira com
touchmove
, mas os iPhones acionam o touchmove mesmo que não haja movimento. Em teoria, você poderia simplesmente comparar otouchstart
etouchend
eventospageX
epageY
, mas em iPhones, não há nenhumatouchend
pageX
oupageY
.Infelizmente, para cobrir todas as bases, acaba um pouco mais complicado.
Em teoria, existem maneiras de obter o tempo exato usado para uma impressão longa, em vez de apenas usar 1000 como uma aproximação, mas na prática não é tão simples e é melhor usar um proxy razoável .
fonte
A resposta de MacFreak foi extremamente útil para mim. Aqui estão alguns códigos práticos, caso ajudem.
PROBLEMA - aplicando touchend significa que toda vez que você o dedo sobre um elemento, ele responde como se você o tivesse pressionado, mesmo se você estivesse apenas tentando passar o mouse.
Estou criando um efeito com o jQuery que diminui uma linha sob alguns botões para "destacar" o botão pairado. Não quero que isso signifique que você deve pressionar o botão duas vezes nos dispositivos sensíveis ao toque para seguir o link.
Aqui estão os botões:
Eu quero que a div "menu_underline" desapareça no mouseover e desapareça no mouseout. MAS quero que os dispositivos de toque possam seguir o link em um único clique, não em dois.
SOLUÇÃO - Aqui está o jQuery para fazê-lo funcionar:
Muito obrigado pela sua ajuda neste MacFreak.
fonte
Acabei de descobrir que funciona se você adicionar um ouvinte vazio, não me pergunte por que, mas testei no iPhone e iPad com o iOS 9.3.2 e funcionou bem.
fonte
Eu acho que seus links não têm evento onmouseover, onde 1 toque ativa onmouseover e o toque duplo ativa o link. mas idk. Eu não tenho um iPad. Eu acho que você precisa usar eventos de gestos / toques.
https://developer.apple.com/documentation/webkitjs
fonte
Eu tive o mesmo problema, mas não em um dispositivo de toque. O evento é acionado toda vez que você clica. Há algo sobre enfileiramento de eventos ou algo assim.
No entanto, minha solução foi a seguinte: no evento de clique (ou toque?), Você define um cronômetro. Se o link for clicado novamente dentro de X ms, você retornará false.
Para definir por timer de elemento, você pode usar
$.data()
.Isso também pode corrigir o problema do @Ferdy descrito acima.
fonte
Se você usa o Modernizr, é muito fácil usar o Modernizr.touch como mencionado anteriormente.
No entanto, prefiro usar uma combinação de Modernizr.touch e teste de agente de usuário, apenas por segurança.
Se você não usa o Modernizr, pode simplesmente substituir a
Modernizr.touch
função acima por('ontouchstart' in document.documentElement)
Observe também que o teste do agente do usuário iemobile oferecerá uma gama mais ampla de dispositivos móveis Microsoft detectados que o Windows Phone.
fonte
Você pode usar
click touchend
,exemplo:
O exemplo acima afetará todos os links em dispositivos touch.
Se você deseja direcionar apenas links específicos, pode fazer isso definindo uma classe neles, ou seja:
HTML:
<a href="example.html" class="prevent-extra-click">Prevent extra click on touch device</a>
Jquery:
Felicidades,
Jeroen
fonte
Encontrei uma situação semelhante em que eventos vinculados aos estados mouseenter / mouseleave / click de um elemento, mas em um iPhone, o usuário teve que clicar duas vezes no elemento para acionar primeiro o evento mouseenter e, em seguida, novamente para acionar o evento click .
Resolvi isso usando um método semelhante ao descrito acima, mas fiz uso do plugin jQuery $ .browser (para jQuery 1.9>) e adicionei um evento .trigger ao evento de ligação do mouseenter, da seguinte maneira:
O .trigger evita a necessidade de clicar duas vezes no elemento acionando o manipulador de eventos .click no mouseenter (ou clique inicial) do elemento quando visualizado em iPhones ou iPads. Pode não ser a solução mais elegante, mas funciona muito bem no meu caso e utiliza um plug-in que eu já tinha instalado, e exigi que eu adicionasse uma única linha de código para que meus eventos existentes funcionassem nesses dispositivos.
Você pode obter o plugin jQuery $ .browser aqui: https://github.com/gabceb/jquery-browser-plugin
fonte
Apenas uma melhoria para evitar o redirecionamento quando você desliza o dedo em um link por engano.
fonte
Com inspiração no MacFreak, montei algo que funciona para mim.
Esse método js evita que o cursor fique preso em um ipad e evita que o clique seja registrado como dois cliques em alguns casos. No CSS, se você tiver alguma: classes hover psudo em seu css, altere-as para .hover Por exemplo .some-class: hover para .some-class.hover
Teste este código em um ipad para ver como o método css e js hover se comportam de maneira diferente (apenas no efeito hover). O botão CSS não possui um alerta de clique sofisticado. http://jsfiddle.net/bensontrent/ctgr6stm/
fonte
Para que os links funcionem sem interromper a rolagem por toque, resolvi isso com o evento "tap" do jQuery Mobile:
fonte
Estou muito atrasado, eu sei, mas esta é uma das soluções mais fáceis que encontrei:
Isso não funciona apenas para links (tags âncora), mas também para outros elementos. Espero que isto ajude.
fonte
Este pequeno trecho parece funcionar. Acione o evento de clique quando o link for tocado:
fonte
Nenhuma da outra resposta funciona para mim. Meu aplicativo tem muitos ouvintes de eventos, caixas de seleção e links próprios que têm ouvintes e links sem ouvintes.
Eu uso isso:
fonte
Isso funciona para mim quando você tem o menu suspenso jquery ui
fonte
Evite alterar o estilo "display" dentro do evento hover css. Eu tinha "display: block" no estado de foco. Depois de remover o ios, lins passou por um único toque. A propósito, parece que as atualizações mais recentes do IOS corrigiram esse "recurso"
fonte
A maneira mais simples de resolver clique duas vezes no IPad é agrupar seu css para efeito de foco na consulta de mídia
@media (pointer: fine)
:O CSS envolvido nesta consulta de mídia será aplicado apenas na área de trabalho.
A explicação desta solução está aqui https://css-tricks.com/annoying-mobile-double-tap-link-issue/
fonte
Você pode verificar
navigator.userAgent
assim:mas você precisaria procurar amoras, dróides e outros dispositivos touchscreen. Você também pode vincular os mouseovers apenas se o userAgent contiver Mozilla, IE, Webkit ou Opera, mas ainda precisar rastrear alguns dispositivos, porque o Droid, por exemplo, relata sua string userAgent como:
A string do iPhone é semelhante. Se você apenas tela para iPhone, iPod, iPad, Android e Blackberry, pode obter a maioria dos computadores de mão, mas não todos.
fonte
Basta fazer uma consulta de mídia CSS que exclua tablets e dispositivos móveis e colocar o cursor sobre ele. Você realmente não precisa de jQuery ou JavaScript para isso.
E não se esqueça de adicionar isso ao seu cabeçalho html para garantir que ele calcule com os pixels reais e não com a resolução.
fonte