J'ai écrit un plug-in jQuery à utiliser à la fois sur les appareils de bureau et mobiles. Je me demandais s'il y avait un moyen avec JavaScript pour détecter si l'appareil a une capacité d'écran tactile. J'utilise jquery-mobile.js pour détecter les événements de l'écran tactile et cela fonctionne sur iOS, Android, etc., mais j'aimerais également écrire des instructions conditionnelles selon que l'appareil de l'utilisateur dispose d'un écran tactile.
Est-ce possible?
javascript
jquery
touch
screenm0nkey
la source
la source
Réponses:
Mise à jour: veuillez lire la réponse de blmstr ci-dessous avant d' insérer une bibliothèque complète de détection de fonctionnalités dans votre projet. La détection de la prise en charge tactile réelle est plus complexe et Modernizr ne couvre qu'un cas d'utilisation de base.
Modernizr est un excellent moyen léger de faire toutes sortes de détection de fonctionnalités sur n'importe quel site.
Il ajoute simplement des classes à l'élément html pour chaque fonctionnalité.
Vous pouvez ensuite cibler ces fonctionnalités facilement en CSS et JS. Par exemple:
Et Javascript (exemple jQuery):
la source
Modernizr.touch
retour inattenduundefined
, vous pourriez avoir un Modernizr personnalisé (vous pouvez choisir) sans prise en charge de la détection des événements tactiles.Avez-vous essayé d'utiliser cette fonction? (C'est le même que celui utilisé par Modernizr.)
MISE À JOUR 1
document.createEvent("TouchEvent")
ont commencé à revenirtrue
dans le dernier chrome (v. 17). Modernizr l'a mis à jour il y a quelque temps. Consultez le test Modernizr ici .Mettez à jour votre fonction comme ceci pour la faire fonctionner:
MISE À JOUR 2
J'ai trouvé que ce qui précède ne fonctionnait pas sur IE10 (renvoyant faux sur MS Surface). Voici le correctif:
MISE À JOUR 3
'onmsgesturechange' in window
retournera vrai dans certaines versions de bureau IE donc ce n'est pas fiable. Cela fonctionne de manière un peu plus fiable:MISE À JOUR 2018
Le temps passe et il existe de nouvelles et meilleures façons de le tester. J'ai essentiellement extrait et simplifié la manière de vérifier de Modernizr:
Ici, ils utilisent la
touch-enabled
fonction de requête multimédia non standard , ce qui, je pense, est un peu étrange et une mauvaise pratique. Mais bon, dans le monde réel, je suppose que ça marche. À l'avenir (lorsqu'elles seront prises en charge par tous), ces fonctionnalités de requête multimédia pourraient vous donner les mêmes résultats:pointer
ethover
.Découvrez la source de la façon dont Modernizr le fait .
Pour un bon article qui explique les problèmes de détection tactile, voir: Stu Cox: vous ne pouvez pas détecter un écran tactile .
la source
true
oufalse
. Vous pouvez en savoir plus à ce sujet ici: stackoverflow.com/questions/4686583/…in
opérateur évalue déjà un booléen.'onmsgesturechange'
évalue vrai même dans les appareils non tactiles (PC).window.navigator.msMaxTouchPoints
semble être plus précis. Je l'ai trouvé ici .Comme Modernizr ne détecte pas IE10 sur Windows Phone 8 / WinRT, une solution simple et multi-navigateur est:
Vous n'avez besoin de vérifier qu'une seule fois, car l'appareil ne prend pas en charge ou ne prend pas en charge le toucher, alors stockez-le simplement dans une variable afin de pouvoir l'utiliser plusieurs fois plus efficacement.
la source
return !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
(pour combiner les deux réponses) Fonctionne bien dans IE10 aussi!'onmsgesturechange' in window
retourne vrai sur le bureau IE10 même lorsque le toucher est possiblefunction isTouchDevice() { return 'ontouchstart' in window || !!(navigator.msMaxTouchPoints);}
En utilisant tous les commentaires ci-dessus, j'ai assemblé le code suivant qui fonctionne pour mes besoins:
J'ai testé cela sur iPad, Android (navigateur et Chrome), Blackberry Playbook, iPhone 4s, Windows Phone 8, IE 10, IE 8, IE 10 (Windows 8 avec écran tactile), Opera, Chrome et Firefox.
Il échoue actuellement sur Windows Phone 7 et je n'ai pas encore trouvé de solution pour ce navigateur.
J'espère que quelqu'un trouvera cela utile.
la source
true
sur mon Firefox 32 sur Windows 7 :(Depuis l'introduction des fonctionnalités de médias d'interaction, vous pouvez simplement faire:
https://www.w3.org/TR/mediaqueries-4/#descdef-media-any-pointer
Mise à jour (en raison des commentaires): La solution ci-dessus consiste à détecter si un "pointeur grossier" - généralement un écran tactile - est le périphérique d'entrée principal. Dans le cas où vous souhaitez détecter si un appareil avec par exemple une souris a également un écran tactile, vous pouvez utiliser à la
any-pointer: coarse
place.Pour plus d'informations, regardez ici: Détecter que le navigateur n'a pas de souris et est tactile uniquement
la source
(pointer: coarse)
car vous ne ciblez probablement que l'entrée principale. Peut être utilisé en production, car les quelques navigateurs non compatibles sont uniquement de bureau. Il y a un excellent article à ce sujet sur les astuces CSS .J'aime celui la:
la source
function isTouchDevice(){ return (window.ontouchstart !== undefined); }
var isTouch = 'ontouchstart' in window;
:, mais cela ne fonctionne pas avec le dernier Chrome (v31),var isTouch = 'createTouch' in window.document;
fonctionne toujours.touchstart
ne reconnaîtront pas Surface comme un appareil tactile car IE utilise despointer
événements à la place.Si vous utilisez Modernizr , il est très facile à utiliser
Modernizr.touch
comme mentionné précédemment.Cependant, je préfère utiliser une combinaison de
Modernizr.touch
tests d'agent utilisateur pour des raisons de sécurité.Si vous n'utilisez pas Modernizr, vous pouvez simplement remplacer la
Modernizr.touch
fonction ci-dessus par('ontouchstart' in document.documentElement)
Notez également que le test de l'agent utilisateur
iemobile
vous donnera une gamme plus large d'appareils mobiles Microsoft détectés queWindows Phone
.Voir aussi cette question SO
la source
/(iphone|ipod|ipad|android|iemobile|blackberry|bada)/.test(window.navigator.userAgent.toLowerCase())
Nous avons essayé l'implémentation modernizr, mais la détection des événements tactiles n'est plus cohérente (IE 10 a des événements tactiles sur le bureau Windows, IE 11 fonctionne, car ils ont supprimé les événements tactiles et ajouté une api de pointeur).
Nous avons donc décidé d'optimiser le site Web en tant que site tactile tant que nous ne savons pas de quel type d'entrée l'utilisateur dispose. C'est plus fiable que toute autre solution.
Nos recherches indiquent que la plupart des utilisateurs de bureau se déplacent avec leur souris sur l'écran avant de cliquer, afin que nous puissions les détecter et modifier le comportement avant de pouvoir cliquer ou survoler quoi que ce soit.
Il s'agit d'une version simplifiée de notre code:
la source
Violon de travail
Je l'ai réalisé comme ça;
la source
Il y a quelque chose de mieux que de vérifier s'ils ont un écran tactile, c'est de vérifier s'ils l'utilisent, et c'est plus facile à vérifier.
la source
Celui-ci fonctionne bien même dans les tablettes Windows Surface !!!
la source
J'ai utilisé des morceaux du code ci-dessus pour détecter s'il était tactile, donc mes iframes fancybox s'afficheraient sur les ordinateurs de bureau et non sur le toucher. J'ai remarqué que Opera Mini pour Android 4.0 s'enregistrait toujours en tant qu'appareil non tactile lors de l'utilisation du code de blmstr seul. (Quelqu'un sait-il pourquoi?)
J'ai fini par utiliser:
la source
/iPhone|iPod|iPad|Android|BlackBerry/
?Le plus gros problème avec la détection du toucher concerne les appareils hybrides qui prennent en charge le toucher et le trackpad / souris. Même si vous êtes en mesure de détecter correctement si le périphérique de l'utilisateur prend en charge le toucher, ce que vous devez vraiment faire est de détecter le périphérique d'entrée que l'utilisateur utilise actuellement . Il y a une description détaillée de ce défi et une solution possible ici .
Fondamentalement, l'approche pour déterminer si un utilisateur vient de toucher l'écran ou a plutôt utilisé une souris / un pavé tactile consiste à enregistrer à la fois un événement
touchstart
et unmouseover
événement sur la page:Une action tactile déclenchera ces deux événements, bien que le premier (
touchstart
) soit toujours le premier sur la plupart des appareils. Ainsi, en comptant sur cette séquence d'événements prévisible, vous pouvez créer un mécanisme qui ajoute ou supprime dynamiquement unecan-touch
classe à la racine du document pour refléter le type d'entrée actuel de l'utilisateur à ce moment sur le document:Plus de détails ici .
la source
Consultez cet article , il donne un très bel extrait de code pour savoir quoi faire lorsque des appareils tactiles sont détectés ou quoi faire si un événement touchstart est appelé:
la source
J'éviterais d'utiliser la largeur de l'écran pour déterminer si un appareil est un appareil tactile. Il y a des écrans tactiles beaucoup plus grands que 699px, pensez à Windows 8. Navigatior.userAgent peut être agréable pour remplacer les faux positifs.
Je recommanderais de vérifier ce problème sur Modernizr.
Voulez-vous tester si l'appareil prend en charge les événements tactiles ou s'il s'agit d'un appareil tactile. Malheureusement, ce n'est pas la même chose.
la source
Non, ce n'est pas possible. Les excellentes réponses données ne sont que partielles, car toute méthode donnée produira des faux positifs et des faux négatifs. Même le navigateur ne sait pas toujours si un écran tactile est présent, en raison des API du système d'exploitation, et le fait peut changer pendant une session de navigateur, en particulier avec des dispositions de type KVM.
Voir plus de détails dans cet excellent article:
http://www.stucox.com/blog/you-cant-detect-a-touchscreen/
L'article vous suggère de reconsidérer les hypothèses qui vous donnent envie de détecter les écrans tactiles, elles sont probablement fausses. (J'ai vérifié la mienne pour mon application et mes hypothèses étaient en effet erronées!)
L'article conclut:
la source
Beaucoup de ces travaux mais nécessitent soit jQuery, soit des linters javascript se plaignent de la syntaxe. Considérant que votre question initiale demande une manière "JavaScript" (pas jQuery, pas Modernizr) de résoudre cela, voici une fonction simple qui fonctionne à chaque fois. C'est aussi aussi minime que possible.
Un dernier avantage que je mentionnerai est que ce code est indépendant du framework et du périphérique. Prendre plaisir!
la source
function isTouchScreen() { return window.matchMedia('(hover: none)').matches;}
Cela a fonctionné pour moi, donc j'ajoute ici une contribution à cette réponse, car je m'attendais également à un fil JS vanille lorsque Google m'a amené ici.Il semble que Chrome 24 prenne désormais en charge les événements tactiles, probablement pour Windows 8. Le code publié ici ne fonctionne donc plus. Au lieu d'essayer de détecter si le toucher est pris en charge par le navigateur, je lie maintenant les événements de toucher et de clic et je m'assure qu'un seul est appelé:
Et puis l'appeler:
J'espère que cela t'aides !
la source
Tous les navigateurs pris en charge, à l'exception de Firefox pour ordinateur de bureau, sont toujours VRAIS, car Firefox pour la conception de support de bureau pour le développeur, même si vous cliquez sur le bouton tactile ou non!
J'espère que Mozilla corrigera cela dans la prochaine version.
J'utilise le bureau Firefox 28.
la source
true
:(jQuery v1.11.3
Il y a beaucoup de bonnes informations dans les réponses fournies. Mais récemment, j'ai passé beaucoup de temps à essayer de tout lier ensemble dans une solution de travail pour accomplir deux choses:
Outre ce message et la détection des appareils à écran tactile avec Javascript , j'ai trouvé ce message de Patrick Lauke extrêmement utile: https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how /
Voici le code ...
Important! La
*.on( events [, selector ] [, data ], handler )
méthode doit avoir un sélecteur, généralement un élément, qui peut gérer l'événement "touchstart", ou tout autre événement similaire associé aux touches. Dans ce cas, c'est l'élément hyperlien "a".Maintenant, vous n'avez pas besoin de gérer le clic de souris normal en JavaScript, car vous pouvez utiliser CSS pour gérer ces événements en utilisant des sélecteurs pour l'élément de lien hypertexte "a" comme ceci:
Remarque: Il existe également d'autres sélecteurs ...
la source
ou
serait une vérification plus approfondie, je suppose.
la source
ua
fait référencenavigator.userAgent
. De plus, la détection par largeur d'écran peut donner de faux résultats si quelqu'un ouvre un navigateur en mode non plein écran.J'utilise:
dans jQuery mobile 1.0.1
la source
J'ai également eu beaucoup de mal avec différentes options sur la façon de détecter en Javascript si la page est affichée sur un appareil à écran tactile ou non. IMO, pour l'instant, il n'existe aucune option réelle pour détecter correctement l'option. Les navigateurs signalent les événements tactiles sur les ordinateurs de bureau (car le système d'exploitation peut être prêt pour le toucher), ou certaines solutions ne fonctionnent pas sur tous les appareils mobiles.
En fin de compte, j'ai réalisé que je suivais la mauvaise approche depuis le début: si ma page devait ressembler sur des appareils tactiles et non tactiles, je ne devrais peut-être pas avoir à me soucier de détecter la propriété du tout: mon scénario était pour désactiver les info-bulles sur les boutons sur les appareils tactiles car elles mènent à des tapotements où je voulais un seul tap pour activer le bouton.
Ma solution a été de refactoriser la vue afin qu'aucune info-bulle ne soit nécessaire sur un bouton, et finalement je n'ai pas eu besoin de détecter le périphérique tactile à partir de Javascript avec des méthodes qui ont toutes leurs inconvénients .
la source
Vous pouvez installer le moderniseur et utiliser un simple événement tactile. C'est très efficace et fonctionne sur tous les appareils sur lesquels j'ai testé, y compris la surface des fenêtres!
J'ai créé un jsFiddle
la source
La réponse pratique semble être celle qui considère le contexte:
1) Site public (pas de connexion)
Codez l'interface utilisateur pour travailler avec les deux options ensemble.
2) Site de connexion
Capturez si un déplacement de la souris s'est produit sur le formulaire de connexion et enregistrez-le dans une entrée cachée. La valeur est transmise avec les informations d'identification de connexion et ajoutée à la session de l'utilisateur , afin qu'elle puisse être utilisée pendant la durée de la session.
Jquery à ajouter à la page de connexion uniquement:
(+1 à @Dave Burt et +1 à @Martin Lantzsch sur leurs réponses)
la source
Le problème
En raison des appareils hybrides qui utilisent une combinaison de saisie tactile et de souris, vous devez pouvoir modifier dynamiquement l'état / la variable qui contrôle si un morceau de code doit s'exécuter si l'utilisateur est un utilisateur tactile ou non.
Les appareils tactiles se déclenchent également
mousemove
au robinet.Solution
touchstart
événement se déclenche, puis définissez-le sur true.Testé sur Safari iOS et Chrome pour Android.
Remarque: pas sûr à 100% des événements de pointeur pour MS Surface, etc.
Démo Codepen
la source
En fait, j'ai fait des recherches sur cette question et je considère toutes les situations. car c'est aussi un gros problème sur mon projet. J'atteins donc la fonction ci-dessous, elle fonctionne pour toutes les versions de tous les navigateurs sur tous les appareils:
Astuce : Certainement, le
isTouchDevice
retourne juste desboolean
valeurs.la source
support
Objet jQuery étendu :Et maintenant, vous pouvez le vérifier n'importe où, comme ceci:
la source
Jusqu'à présent, cela semble bien fonctionner:
la source
Lorsqu'une souris est connectée, on peut supposer avec un taux de réussite assez élevé (je dirais pratiquement 100%) que l'utilisateur déplace la souris au moins une petite distance après que la page est prête - sans aucun clic. Le mécanisme ci-dessous le détecte. S'il est détecté, je considère cela comme un signe de manque de prise en charge tactile ou, s'il est pris en charge, d'importance mineure lorsqu'une souris est utilisée. L'appareil tactile est supposé s'il n'est pas détecté.
MODIFIER Cette approche peut ne pas convenir à tous les objectifs. Il peut être utilisé pour contrôler les fonctionnalités activées en fonction de l'interaction de l'utilisateur sur la page chargée, par exemple une visionneuse d'images. Le code ci-dessous laissera également l'événement mousemove lié aux appareils sans souris tel qu'il se distingue maintenant. D'autres approches peuvent être meilleures.
En gros, ça se passe comme ça (désolé pour jQuery, mais similaire en Javascript pur):
la source