En Javascript/jQuery, comment puis-je détecter si le périphérique client est équipé d'une souris?
J'ai un site qui glisse un petit panneau d'information lorsque l'utilisateur passe la souris sur un élément. J'utilise jQuery.hoverIntent pour détecter le survol, mais cela ne fonctionne évidemment pas sur les appareils à écran tactile tels que l'iPhone/iPad/Android. Donc, sur ces appareils, j'aimerais revenir à appuyer sur pour afficher le panneau d'informations.
+1 pour faire hover
et click
les deux. Une autre solution consiste à utiliser les requêtes de média CSS et à utiliser certains styles uniquement pour les écrans/appareils mobiles plus petits, qui sont les plus susceptibles d’avoir une fonctionnalité tactile. Ainsi, si vous avez des styles spécifiques via CSS et que jQuery vous permet de vérifier ces éléments pour les propriétés de style de périphérique mobile, vous pouvez les intégrer pour écrire votre code spécifique pour mobile.
Voir ici: http://www.forabeautifulweb.com/blog/about/hardboiled_css3_media_queries/
var isTouchDevice = 'ontouchstart' in document.documentElement;
Note: Le fait qu'un périphérique prenne en charge les événements tactiles ne signifie pas nécessairement qu'il s'agit exclusivement d'un périphérique à écran tactile. De nombreux appareils (tels que mon Asus Zenbook) prennent en charge les événements de clic et tactiles, même s'ils ne disposent pas de mécanisme de saisie tactile. Lors de la conception pour la prise en charge tactile, incluez toujours la prise en charge des événements clic et ne supposez jamais qu'un périphérique est exclusivement l'un ou l'autre.
Les tests trouvés pour window.Touch ne fonctionnaient pas sur Android mais cela fonctionne:
function is_touch_device() {
return !!('ontouchstart' in window);
}
Voir l'article: Quel est le meilleur moyen de détecter un appareil à écran tactile avec JavaScript?
return (('ontouchstart' in window)
|| (navigator.maxTouchPoints > 0)
|| (navigator.msMaxTouchPoints > 0));
Raison de l'utilisation de maxTouchPoints avec msMaxTouchPoints:
Microsoft a indiqué que, à partir d'Internet Explorer 11, la version à préfixe Microsoft de cette propriété (msMaxTouchPoints) peut être supprimée et recommande l'utilisation de maxTouchPoints à la place.
Source: http://ctrlq.org/code/19616-detect-touch-screen-javascript
if ("ontouchstart" in window || navigator.msMaxTouchPoints) {
isTouch = true;
} else {
isTouch = false;
}
Fonctionne partout!
Google Chrome semble renvoyer des faux positifs sur celui-ci:
var isTouch = 'ontouchstart' in document.documentElement;
Je suppose que cela a quelque chose à voir avec sa capacité à "émuler les événements tactiles" (F12 -> paramètres dans le coin inférieur droit -> onglet "écrasements" -> dernière case à cocher). Je sais que cette option est désactivée par défaut, mais c’est avec cela que je relie le changement de résultats (la méthode "in" utilisée pour fonctionner dans Chrome). Cependant, cela semble fonctionner, dans la mesure où j'ai testé:
var isTouch = !!("undefined" != typeof document.documentElement.ontouchstart);
Tous les navigateurs sur lesquels j'ai exécuté ce code sont dans l'état typeof est "objet" mais je me sens plus certain de savoir que c'est n'importe quoi mais non défini :-)
Testé sur IE7, IE8, IE9, IE10, Chrome 23.0.1271.64, Chrome pour iPad 21.0.1180.80 et iPad Safari. Ce serait bien si quelqu'un faisait encore plus de tests et partagé les résultats.
J'utilise:
if(jQuery.support.touch){
alert('Touch enabled');
}
dans jQuery mobile 1.0.1
Pour mon premier post/commentaire: nous savons tous que le "touchstart" est déclenché avant le clic. Nous savons également que lorsque l'utilisateur ouvrira votre page, il devra: 1) déplacer la souris 2) cliquer sur 3) toucher l'écran (pour le défilement ou ... :))
Essayons quelque chose:
// -> Démarrer: jQuery
var hasTouchCapabilities = 'ontouchstart' in window && (navigator.maxTouchPoints || navigator.msMaxTouchPoints);
var isTouchDevice = hasTouchCapabilities ? 'maybe':'nope';
//attach a once called event handler to window
$(window).one('touchstart mousemove click',function(e){
if ( isTouchDevice === 'maybe' && e.type === 'touchstart' )
isTouchDevice = 'yes';
});
// <- Fin: jQuery
Bonne journée!
Ceci est écrit pour un de mes sites et constitue probablement la solution la plus infaillible. D'autant que même Modernizr peut obtenir des faux positifs lors de la détection tactile.
Si vous utilisez jQuery
$(window).one({
mouseover : function(){
Modernizr.touch = false; // Add this line if you have Modernizr
$('html').removeClass('touch').addClass('mouse');
}
});
ou tout simplement JS ...
window.onmouseover = function(){
window.onmouseover = null;
document.getElementsByTagName("html")[0].className += " mouse";
}
Un article de blog utile sur le sujet, lié à partir de la source Modernizr pour la détection d'événements tactiles. Conclusion: il n'est pas possible de détecter de manière fiable les appareils à écran tactile à partir de Javascript.
J'ai testé le code suivant mentionné ci-dessus dans la discussion
function is_touch_device() {
return !!('ontouchstart' in window);
}
fonctionne sur Android Mozilla, Chrome, Opera, Android navigateur par défaut et safari sur iphone ... tous positifs ...
semble solide pour moi :)
Cela fonctionne pour moi:
function isTouchDevice(){
return true == ("ontouchstart" in window || window.DocumentTouch && document instanceof DocumentTouch);
}
Si vous utilisez Modernizr , il est très facile d’utiliser Modernizr.touch
comme mentionné précédemment.
Cependant, je préfère utiliser une combinaison de Modernizr.touch
et les tests d’agent d’utilisateur, par sécurité.
var deviceAgent = navigator.userAgent.toLowerCase();
var isTouchDevice = Modernizr.touch ||
(deviceAgent.match(/(iphone|iPod|ipad)/) ||
deviceAgent.match(/(Android)/) ||
deviceAgent.match(/(iemobile)/) ||
deviceAgent.match(/iphone/i) ||
deviceAgent.match(/ipad/i) ||
deviceAgent.match(/iPod/i) ||
deviceAgent.match(/blackberry/i) ||
deviceAgent.match(/bada/i));
if (isTouchDevice) {
//Do something touchy
} else {
//Can't touch this
}
Si vous n'utilisez pas Modernizr, vous pouvez simplement remplacer le Modernizr.touch
fonction ci-dessus avec ('ontouchstart' in document.documentElement)
Notez également que le test de l'agent utilisateur iemobile
vous donnera une gamme plus étendue de périphériques mobiles Microsoft détectés que Windows Phone
.
Dans jQuery Mobile, vous pouvez simplement faire:
$.support.touch
Je ne sais pas pourquoi c'est si peu documenté .. mais c'est sécurisé pour crossbrowser (les 2 dernières versions des navigateurs actuels).