Em Javascript / jQuery, como posso detectar se o dispositivo cliente possui um mouse?
Eu tenho um site que desliza um pequeno painel de informações quando o usuário passa o mouse sobre um item. Estou usando o jQuery.hoverIntent para detectar o foco, mas isso obviamente não funciona em dispositivos touchscreen como iPhone / iPad / Android. Então, nesses dispositivos, eu gostaria de reverter para tocar para mostrar o painel de informações.
javascript
jquery
iphone
android
Brad Robinson
fonte
fonte
:hover
, provavelmente é melhor (ao codificar uma folha de estilo para vários dispositivos) usar:hover
para fins puramente cosméticos.Respostas:
+1 para fazer
hover
eclick
ambos. Uma outra maneira poderia ser usar consultas de mídia CSS e usar alguns estilos apenas para telas / dispositivos móveis menores, que são os que têm mais probabilidade de ter a funcionalidade de toque / toque. Portanto, se você tem alguns estilos específicos via CSS e, no jQuery, verifica esses elementos para as propriedades de estilo do dispositivo móvel, pode conectar-se a eles para escrever um código específico para o seu celular.Veja aqui: http://www.forabeautifulweb.com/blog/about/hardboiled_css3_media_queries/
fonte
Nota : O fato de um dispositivo suportar eventos de toque não significa necessariamente que ele é exclusivamente um dispositivo de tela de toque. Muitos dispositivos (como o meu Asus Zenbook) suportam eventos de clique e toque, mesmo quando não possuem nenhum mecanismo de entrada de toque real. Ao projetar para suporte por toque, sempre inclua suporte a eventos de clique e nunca assuma que um dispositivo seja exclusivamente um ou outro.
fonte
'ontouchstart' in document.documentElement
retorna incorretamente true no BlackBerry 9300O teste encontrado para o window.Touch não funcionou no Android, mas faz isso:
Veja o artigo: Qual é a melhor maneira de detectar um dispositivo 'touch screen' usando JavaScript?
fonte
Motivo para usar maxTouchPoints junto com o msMaxTouchPoints:
Fonte: http://ctrlq.org/code/19616-detect-touch-screen-javascript
fonte
Funciona em todos os lugares !!
fonte
isTouch = "ontouchstart" in window || navigator.msMaxTouchPoints;
Eu uso:
no jQuery mobile 1.0.1
fonte
O Google Chrome parece retornar falsos positivos neste:
Suponho que tenha algo a ver com a capacidade de "emular eventos de toque" (F12 -> configurações no canto inferior direito -> guia "substitui" - - última caixa de seleção). Sei que está desativado por padrão, mas é com isso que conecto a alteração nos resultados (o método "in" usado para trabalhar no Chrome). No entanto, isso parece estar funcionando, tanto quanto eu testei:
Em todos os navegadores em que corri esse código, o typeof é "objeto", mas tenho mais certeza de que é indefinido :-)
Testado no IE7, IE8, IE9, IE10, Chrome 23.0.1271.64, Chrome para iPad 21.0.1180.80 e iPad Safari. Seria legal se alguém fizesse mais alguns testes e compartilhasse os resultados.
fonte
Escrevi isso para um dos meus sites e provavelmente é a solução mais infalível. Especialmente porque até o Modernizr pode obter falsos positivos na detecção de toque.
Se você estiver usando jQuery
ou apenas JS puro ...
fonte
Para meu primeiro post / comentário: todos sabemos que o 'touchstart' é acionado antes do clique. Também sabemos que, quando o usuário abrir sua página, ele (a) irá: 1) mover o mouse 2) clicar em 3) tocar na tela (para rolar ou ... :))
Vamos tentar algo:
// -> Iniciar: jQuery
// <- Fim: jQuery
Tenha um bom dia!
fonte
Eu testei o seguinte código mencionado acima na discussão
funciona no Android Mozilla, chrome, Opera, navegador padrão do Android e safari no iphone ... tudo positivo ...
parece sólido para mim :)
fonte
Um post útil sobre o assunto, vinculado a partir da fonte Modernizr para a detecção de eventos de toque. Conclusão: não é possível detectar com segurança dispositivos de tela sensível ao toque do Javascript.
http://www.stucox.com/blog/you-cant-detect-a-touchscreen/
fonte
Isso funciona para mim:
fonte
Se você usa o Modernizr , é muito fácil usar
Modernizr.touch
como mencionado anteriormente.No entanto, eu 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 ao testar o agente do usuário,
iemobile
você terá uma gama mais ampla de dispositivos móveis Microsoft detectados do queWindows Phone
.Veja também esta pergunta do SO
fonte
No jQuery Mobile, você pode simplesmente fazer:
Não sei por que isso é tão indocumentado .. mas é seguro para navegadores cruzados (duas versões mais recentes dos navegadores atuais).
fonte
Como já mencionado, um dispositivo pode suportar entradas de mouse e toque. Muitas vezes, a questão não é "o que é suportado", mas "o que é usado atualmente".
Nesse caso, você pode simplesmente registrar eventos do mouse (incluindo o ouvinte ao passar o mouse) e tocar em eventos da mesma forma.
O JavaScript deve chamar automaticamente o ouvinte correto com base na entrada do usuário. Então, no caso de um evento de toque,
onTouchStartCallback
será acionado, emulando seu código de foco.Observe que um toque pode disparar os dois tipos de ouvintes, toque e mouse. No entanto, o ouvinte de toque é o primeiro e pode impedir que ouvintes de mouse subseqüentes sejam acionados chamando
event.preventDefault()
.Leia mais aqui .
fonte
Para o desenvolvimento do iPad, estou usando:
Posso então ligar-me seletivamente aos eventos baseados em toque (por exemplo, ontouchstart) ou em eventos baseados em mouse (por exemplo, onmousedown). Ainda não testei no Android.
fonte