He escrito un complemento jQuery que se usa en dispositivos de escritorio y móviles. Me preguntaba si hay una manera con JavaScript para detectar si el dispositivo tiene capacidad de pantalla táctil. Estoy usando jquery-mobile.js para detectar los eventos de la pantalla táctil y funciona en iOS, Android, etc., pero también me gustaría escribir declaraciones condicionales en función de si el dispositivo del usuario tiene una pantalla táctil.
¿Es eso posible?
javascript
jquery
touch
screenm0nkey
fuente
fuente
Respuestas:
Actualización: lea la respuesta de blmstr a continuación antes de incluir una biblioteca de detección de características completa en su proyecto. Detectar el soporte táctil real es más complejo, y Modernizr solo cubre un caso de uso básico.
Modernizr es una forma excelente y liviana de realizar todo tipo de detección de funciones en cualquier sitio.
Simplemente agrega clases al elemento html para cada característica.
Luego puede orientar esas funciones fácilmente en CSS y JS. Por ejemplo:
Y Javascript (ejemplo de jQuery):
fuente
Modernizr.touch
regresa inesperadamenteundefined
, es posible que tenga un Modernizador personalizado (puede elegir y elegir) sin soporte para la detección de eventos táctiles.¿Has intentado usar esta función? (Esto es lo mismo que Modernizr solía usar).
ACTUALIZACIÓN 1
document.createEvent("TouchEvent")
han comenzado a regresartrue
en el último Chrome (v. 17). Modernizr actualizó esto hace un tiempo. Mira la prueba Modernizr aquí .Actualice su función de esta manera para que funcione:
ACTUALIZACIÓN 2
Descubrí que lo anterior no funcionaba en IE10 (devolviendo falso en MS Surface). Aquí está la solución:
ACTUALIZACIÓN 3
'onmsgesturechange' in window
volverá cierto en algunas versiones de escritorio de IE, por lo que no es confiable. Esto funciona de manera un poco más confiable:ACTUALIZACIÓN 2018
El tiempo pasa y hay nuevas y mejores formas de probar esto. Básicamente, he extraído y simplificado la forma en que Modernizr lo verifica:
Aquí están utilizando la
touch-enabled
función de consulta de medios no estándar , que creo que es un poco raro y una mala práctica. Pero bueno, en el mundo real, supongo que funciona. En el futuro (cuando sean compatibles con todos) esas funciones de consulta de medios podrían brindarle los mismos resultados:pointer
yhover
.Echa un vistazo a la fuente de cómo lo está haciendo Modernizr .
Para ver un buen artículo que explica los problemas con la detección táctil, consulte: Stu Cox: no se puede detectar una pantalla táctil .
fuente
true
ofalse
. Puede leer más sobre esto aquí: stackoverflow.com/questions/4686583/…in
operador ya se evalúa como booleano.'onmsgesturechange'
está evaluando verdadero incluso en dispositivos no táctiles (PC).window.navigator.msMaxTouchPoints
Parece ser más preciso. Lo encontré aquí .Como Modernizr no detecta IE10 en Windows Phone 8 / WinRT, una solución simple para varios navegadores es:
Solo necesita verificarlo una vez, ya que el dispositivo no admitirá de repente o no admitirá el tacto, así que simplemente guárdelo en una variable para que pueda usarlo varias veces de manera más eficiente.
fuente
return !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
(para combinar ambas respuestas) ¡Funciona bien en IE10 también!'onmsgesturechange' in window
vuelve verdadero en el escritorio IE10 incluso cuando es posible tocarfunction isTouchDevice() { return 'ontouchstart' in window || !!(navigator.msMaxTouchPoints);}
Utilizando todos los comentarios anteriores, he reunido el siguiente código que funciona para mis necesidades:
He probado esto en iPad, Android (navegador y Chrome), Blackberry Playbook, iPhone 4s, Windows Phone 8, IE 10, IE 8, IE 10 (Windows 8 con pantalla táctil), Opera, Chrome y Firefox.
Actualmente falla en Windows Phone 7 y todavía no he podido encontrar una solución para ese navegador.
Espero que alguien encuentre esto útil.
fuente
true
a mi Firefox 32 en Windows 7 :(Desde la introducción de las funciones de medios de interacción , simplemente puede hacer:
https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer
Actualización (debido a comentarios): la solución anterior es detectar si un "puntero grueso", generalmente una pantalla táctil, es el dispositivo de entrada principal. En caso de que desee detectar si un dispositivo con, por ejemplo, un mouse, también tiene una pantalla táctil, puede usar
any-pointer: coarse
en lugar.Para más información mira aquí: detectar que el navegador no tiene mouse y es solo táctil
fuente
(pointer: coarse)
ya que lo más probable es que solo apunte a la entrada principal. Se puede usar en producción, ya que los pocos navegadores que no son compatibles son solo de escritorio. Hay un gran artículo sobre esto en css-tricks .Me gusta este:
fuente
function isTouchDevice(){ return (window.ontouchstart !== undefined); }
var isTouch = 'ontouchstart' in window;
sin embargo, esto no funciona con el último Chrome (v31),var isTouch = 'createTouch' in window.document;
todavía funciona.touchstart
no reconocerán Surface como un dispositivo táctil porque IE usapointer
eventos en su lugar.Si usa Modernizr , es muy fácil de usar
Modernizr.touch
como se mencionó anteriormente.Sin embargo, prefiero usar una combinación de
Modernizr.touch
pruebas de agente de usuario, solo por seguridad.Si no usa Modernizr, simplemente puede reemplazar la
Modernizr.touch
función anterior con('ontouchstart' in document.documentElement)
También tenga en cuenta que probar el agente de usuario
iemobile
le dará una gama más amplia de dispositivos móviles de Microsoft detectados queWindows Phone
.También vea esta pregunta SO
fuente
/(iphone|ipod|ipad|android|iemobile|blackberry|bada)/.test(window.navigator.userAgent.toLowerCase())
Intentamos la implementación del modernizador, pero la detección de los eventos táctiles ya no es consistente (IE 10 tiene eventos táctiles en el escritorio de Windows, IE 11 funciona, porque han eliminado los eventos táctiles y agregado la api de puntero).
Así que decidimos optimizar el sitio web como un sitio táctil siempre y cuando no sepamos qué tipo de entrada tiene el usuario. Esto es más confiable que cualquier otra solución.
Nuestras investigaciones dicen que la mayoría de los usuarios de escritorio se mueven con el mouse sobre la pantalla antes de hacer clic, para que podamos detectarlos y cambiar el comportamiento antes de que puedan hacer clic o desplazar el cursor sobre cualquier cosa.
Esta es una versión simplificada de nuestro código:
fuente
Violín de trabajo
Lo he logrado así;
fuente
Hay algo mejor que verificar si tienen una pantalla táctil, es verificar si la están usando, y además es más fácil de verificar.
fuente
¡Este funciona bien incluso en tabletas con Windows Surface!
fuente
Utilicé partes del código anterior para detectar si se toca, por lo que mis iframes de fancybox aparecerían en las computadoras de escritorio y no en el tacto. Noté que Opera Mini para Android 4.0 todavía se estaba registrando como un dispositivo no táctil cuando solo usaba el código de blmstr. (¿Alguien sabe por qué?)
Terminé usando:
fuente
/iPhone|iPod|iPad|Android|BlackBerry/
?El mayor "problema" al tratar de detectar el tacto está en los dispositivos híbridos que admiten el tacto y el trackpad / mouse. Incluso si puede detectar correctamente si el dispositivo del usuario admite el tacto, lo que realmente necesita hacer es detectar qué dispositivo de entrada está utilizando actualmente el usuario . Hay una descripción detallada de este desafío y una posible solución aquí .
Básicamente, el enfoque para averiguar si un usuario acaba de tocar la pantalla o utilizar un ratón / trackpad lugar es registrar la vez una
touchstart
ymouseover
eventos en la página:Una acción táctil activará ambos eventos, aunque el primero (
touchstart
) siempre es el primero en la mayoría de los dispositivos. Entonces, contando con esta secuencia predecible de eventos, puede crear un mecanismo que agregue o elimine dinámicamente unacan-touch
clase a la raíz del documento para reflejar el tipo de entrada actual del usuario en este momento en el documento:Más detalles aquí .
fuente
Echa un vistazo a esta publicación , proporciona un fragmento de código realmente agradable para saber qué hacer cuando se detectan dispositivos táctiles o qué hacer si se llama al evento touchstart:
fuente
Evitaría usar el ancho de pantalla para determinar si un dispositivo es táctil. Hay pantallas táctiles mucho más grandes que 699 px, piense en Windows 8. Navigatior.userAgent puede ser bueno para anular falsas notificaciones.
Recomendaría revisar este problema en Modernizr.
¿Desea probar si el dispositivo admite eventos táctiles o es un dispositivo táctil? Desafortunadamente, eso no es lo mismo.
fuente
No, no es posible. Las excelentes respuestas dadas son solo parciales, porque cualquier método producirá falsos positivos y falsos negativos. Incluso el navegador no siempre sabe si hay una pantalla táctil, debido a las API del sistema operativo, y el hecho puede cambiar durante una sesión del navegador, particularmente con arreglos de tipo KVM.
Ver más detalles en este excelente artículo:
http://www.stucox.com/blog/you-cant-detect-a-touchscreen/
El artículo sugiere que reconsidere las suposiciones que lo hacen querer detectar pantallas táctiles, probablemente estén equivocadas. (Revisé la mía para mi aplicación, ¡y mis suposiciones estaban realmente equivocadas!)
El artículo concluye:
fuente
Muchos de estos funcionan, pero requieren jQuery o los linters de JavaScript se quejan de la sintaxis. Teniendo en cuenta que su pregunta inicial requiere una forma de "JavaScript" (no jQuery, no Modernizr) para resolver esto, aquí hay una función simple que funciona siempre. También es lo más mínimo posible.
Una última ventaja que mencionaré es que este código es independiente del marco y del dispositivo. ¡Disfrutar!
fuente
function isTouchScreen() { return window.matchMedia('(hover: none)').matches;}
Esto funcionó para mí, así que estoy aquí agregando una contribución a esta respuesta, ya que también esperaba un hilo vainilla JS cuando Google me trajo aquí.Parece que Chrome 24 ahora admite eventos táctiles, probablemente para Windows 8. Por lo tanto, el código publicado aquí ya no funciona. En lugar de intentar detectar si el navegador admite el tacto, ahora estoy vinculando los eventos táctiles y de clic y me aseguro de que solo se llame uno:
Y luego llamándolo:
Espero que esto ayude !
fuente
¡Todos los navegadores son compatibles, excepto Firefox para escritorio, siempre VERDADERO debido a que Firefox para escritorio admite un diseño receptivo para desarrolladores, incluso si hace clic en el botón táctil o no!
Espero que Mozilla arregle esto en la próxima versión.
Estoy usando el escritorio Firefox 28.
fuente
true
:(jQuery v1.11.3
Hay mucha buena información en las respuestas proporcionadas. Pero, recientemente, pasé mucho tiempo tratando de vincular todo en una solución de trabajo para lograr dos cosas:
Además de esta publicación y Detección de dispositivos de pantalla táctil con Javascript , esta publicación de Patrick Lauke me resultó extremadamente útil: https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how / /
Aquí está el código ...
¡Importante! los
*.on( events [, selector ] [, data ], handler )
método debe tener un selector, generalmente un elemento, que pueda manejar el evento "touchstart" o cualquier otro evento similar asociado con los toques. En este caso, es el elemento de hipervínculo "a".Ahora, no necesita manejar el clic normal del mouse en JavaScript, porque puede usar CSS para manejar estos eventos usando selectores para el elemento de hipervínculo "a" de esta manera:
Nota: También hay otros selectores ...
fuente
o
Sería una verificación más exhaustiva, supongo.
fuente
ua
refiere anavigator.userAgent
. Además, la detección por ancho de pantalla puede dar resultados falsos si alguien abre un navegador en modo de pantalla no completa.Yo suelo:
en jQuery mobile 1.0.1
fuente
También luché mucho con diferentes opciones sobre cómo detectar en Javascript si la página se muestra en un dispositivo de pantalla táctil o no. OMI, a partir de ahora, no existe una opción real para detectar la opción correctamente. Los navegadores informan eventos táctiles en máquinas de escritorio (porque el sistema operativo puede estar listo para tocar) o algunas soluciones no funcionan en todos los dispositivos móviles.
Al final, me di cuenta de que estaba siguiendo el enfoque equivocado desde el principio: si mi página tuviera un aspecto similar en dispositivos táctiles y no táctiles, tal vez no debería tener que preocuparme por detectar la propiedad en absoluto: mi escenario era para desactivar la información sobre herramientas sobre los botones en los dispositivos táctiles, ya que conducen a dos toques en los que quería un solo toque para activar el botón.
Mi solución fue refactorizar la vista para que no se necesita información sobre herramientas sobre un botón, y al final no tuve que detectar el dispositivo táctil de Javascript con métodos que tienen sus inconvenientes .
fuente
Puede instalar el modernizador y usar un evento táctil simple. ¡Esto es muy efectivo y funciona en todos los dispositivos en los que lo he probado, incluida la superficie de Windows!
He creado un jsFiddle
fuente
La respuesta práctica parece ser la que considera el contexto:
1) Sitio público (sin inicio de sesión)
Codifique la IU para que funcione con ambas opciones juntas.
2) Sitio de inicio de sesión
Capture si se produjo un movimiento del mouse en el formulario de inicio de sesión y guárdelo en una entrada oculta. El valor se pasa con las credenciales de inicio de sesión y se agrega a la sesión del usuario , por lo que puede usarse durante la sesión.
Jquery para agregar solo a la página de inicio de sesión:
(+1 a @Dave Burt y +1 a @Martin Lantzsch en sus respuestas)
fuente
El problema
Debido a los dispositivos híbridos que utilizan una combinación de entrada táctil y de mouse, debe poder cambiar dinámicamente el estado / variable que controla si un código debe ejecutarse si el usuario es un usuario táctil o no.
Los dispositivos táctiles también disparan
mousemove
al toque.Solución
touchstart
que se active un evento, luego configúrelo como verdadero.Probado en Safari iOS y Chrome para Android.
Nota: no estoy 100% seguro en los eventos de puntero para MS Surface, etc.
Codepen demo
fuente
En realidad, investigué esta pregunta y considero todas las situaciones. porque también es un gran problema en mi proyecto. Entonces llego a la siguiente función, funciona para todas las versiones de todos los navegadores en todos los dispositivos:
Sugerencia : Definitivamente, el
isTouchDevice
just devuelveboolean
valores.fuente
Extensión
support
objeto jQuery :Y ahora puedes consultarlo en cualquier lugar, así:
fuente
Esto parece estar funcionando bien para mí hasta ahora:
fuente
Cuando se conecta un mouse, se puede suponer con una tasa de aciertos bastante alta (diría que prácticamente al 100%) que el usuario mueve el mouse al menos una pequeña distancia una vez que la página está lista, sin hacer clic. El siguiente mecanismo detecta esto. Si se detecta, considero esto como un signo de falta de soporte táctil o, si es compatible, de menor importancia cuando se usa un mouse. Se supone un dispositivo táctil si no se detecta.
EDITAR Este enfoque puede no ajustarse a todos los propósitos. Se puede utilizar para controlar la funcionalidad que se activa en función de la interacción del usuario en la página cargada, por ejemplo, un visor de imágenes. El código a continuación también dejará el evento mousemove vinculado en dispositivos sin mouse como se destaca ahora. Otros enfoques pueden ser mejores.
Aproximadamente, es así (perdón por jQuery, pero similar en Javascript puro):
fuente