2012-01-06 9 views
19

Hoy (o hace muy poco) Chrome Beta se actualizó a 17 para mí y con él noté algo de funky en mi aplicación web. Me di cuenta de que era porque una clase se estaba añadiendo al elemento de cuerpo que normalmente sólo se pone puso en su lugar si hay apoyo evento táctil que puedo comprobar de esta manera:¿Cómo puedo verificar el soporte táctil real en un navegador

try { 
    document.createEvent("TouchEvent"); 
    _device.touch = true; 
    } catch (e) { 
    _device.touch = false; 
    } 

y, efectivamente, puedo crear y activar eventos táctiles en Chrome 17. La primera idea que tuve fue, oh, puedo verificar el tacto, y ver si falla el clic del mouse, por lo tanto, hay un mouse, pero MouseEvents también se dispara.

¿De qué otro modo puedo verificar, sin que el agente de usuario olfatee, que es un dispositivo real y táctil, y no solo un navegador que admite eventos táctiles?

+0

¿Qué importa si el navegador admite el toque, si la computadora no? Simplemente habilite los eventos táctiles y del mouse y deje que el usuario elija. – Blazemonger

+0

Esto puede ayudarlo: http://stackoverflow.com/questions/2915833/how-to-check-browser-for-touchstart-support-using-js-jquery – sransara

+0

@ mblase75 exactamente lo que estoy buscando. Obv. los dispositivos táctiles se volverán más populares. –

Respuesta

27

Probar:

'ontouchstart' in document.documentElement 
+0

Funciona muy bien :) revisado en Chrome 17, FF9, Safari 5, IE7-9 –

+3

Falla en Chrome 20.: -/ –

+0

@MarcelJackwerth: Déjame comprobar que cuando regrese a Windows, pero en Chrome 19 parece funcionar bien al menos ... – Ryan

9

No es que es probable que no quiere cambiar el comportamiento sólo porque un navegador compatible con tacto '. P.ej. Chrome en Windows ahora admite el toque todo el tiempo, aunque no necesariamente habrá una pantalla táctil conectada. Incluso si hay una pantalla táctil conectada, el usuario no necesariamente la usa, por lo que debe tener cuidado con lo que cambia.

Así que esto realmente se reduce a por qué quiere saber:

  1. ¿Quiere saber si usted va a conseguir touchstart/touchmove/touchend eventos: Realmente no hay manera de saber esto avance seguro. P.ej. el usuario podría conectar una pantalla táctil después de que su página se haya cargado. Si te pueden interesar estos eventos, solo debes escucharlos.

  2. Quiere saber si debe mostrar una versión 'móvil' de su sitio Si el usuario tiene soporte táctil no es la señal adecuada para esto, por ejemplo. un usuario de Windows con una pantalla táctil probablemente NO quiere su sitio móvil. Puede usar heurísticos de UserAgent, pero proporcione al usuario una forma segura de cambiar las versiones de su sitio.

  3. Quiere saber si debe ajustar su interfaz de usuario para que sea más amigable con la entrada táctil Por ejemplo, tal vez algunos botones sean más grandes si es probable que el usuario use el botón táctil. En general, puede ser mejor diseñar siempre para múltiples tipos de punteros: después de todo, no tiene manera de conocer la preferencia del puntero del usuario cuando tienen tanto el tacto como el mouse. Pero si realmente desea utilizar el conocimiento del hardware puntero disponible como una sugerencia para hacer el mejor compromiso de interfaz de usuario, entonces hay nuevas preguntas de los medios de CSS que puede utilizar:

Agregué soporte parcial a Chrome para estos en Chrome 21 (crbug.com/123062). Hasta donde yo sé, ningún otro navegador los admite todavía.

+0

Aunque esto es escamoso. Chrome 25 informa que tengo un puntero: curso y hover: 0 en una computadora portátil Dell de 17 pulgadas. Sí, la computadora portátil tiene soporte para pantalla táctil, pero está apagada y estoy usando un mouse. Eso es un problema. (Tenga en cuenta que esto está empezando a afectarme con aplicaciones web reales: http://core.trac.wordpress.org/ticket/20614#comment:34) – Otto

+0

Mucho de acuerdo, es bueno distinguir entre Mobile y Touch. La pantalla táctil en Windows y las tabletas de 10 "no querrán un sitio de pantalla táctil. Sin embargo, muchos desarrolladores optimizan su uso reemplazando eventos onclick con ontouchstart, etc., para evitar esperar el doble toque. En este caso, detección de puntero sería más efectivo ya que esto afecta a los dispositivos con punteros táctiles Y. –

+0

Otto: así es como se definían las consultas de medios (en términos de los dispositivos con menos capacidad de todos los señaladores). En función de los comentarios, hemos actualizado las consultas de los medios. spec y ahora devolverá el puntero: fine, hover: 1 en casos de laptops con pantalla táctil (pero puntero-any: grueso volverá verdadero). Consulte http://dev.w3.org/csswg/mediaqueries4/#mf-interaction. Espero encontrar esto en Chrome 38: http://crbug.com/136119. –

6
('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch 
+0

Fuente: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js#L40 –

+1

' ('ontouchstart' en la ventana) || window.DocumentTouch && window.document instanceof DocumentTou ch || window.navigator.maxTouchPoints || window.navigator.msMaxTouchPoints? true: false' –

+0

Tenga en cuenta que el equipo FF habilitó y deshabilitó el soporte táctil muchas veces, y finalmente decidió habilitarlo para siempre en la próxima versión 52. –

-4

fácil, do not. si diseña el sitio correctamente, la única razón válida para probarlo es el de los navegadores no táctiles, particularmente los navegadores más antiguos, no crean errores, y dependiendo de cómo haya implementado los eventos táctiles, puede que ni siquiera sea un problema (simplemente no se dispararán), sin embargo cuando se usa una biblioteca como un martillo.js, es necesario crear una instancia del objeto de martillo, en un navegador antiguo como el IE 8 que se generará un error, fácil manera de evitar esto es simplemente envolver ese código en declaraciones try y catch:

try { 
var Hammer = new HAMMER(); 
} catch (err) { 
'do what ever or do nothing, does not support touch or won't work at least anyway' 
} 

en esto permitirá que todos los demás códigos JavaScript continúen.

+0

Eso no tiene sentido, pero tal vez me falta algo. Necesitaba (hace 2 años) saber si era táctil o no, así que podía usar eventos táctiles como 'touchstart' en lugar de' click'. Hacer 'clic' en lugar de' touchstart' crea un retraso notable al tocar y simplemente 'touchstart' no se activará cuando haga clic con el mouse. Incluso si activara un clic en 'touchstart' que sería increíblemente molesto porque en el instante en que presionas el botón del mouse, haría w/e en lugar de hacia abajo y hacia arriba como si se tratara de un clic. –

+1

Este comentario no tiene sentido, ya que requiere el complemento Hammer.js ... – DutchKevv

Cuestiones relacionadas