Comment détecter le navigateur Safari en utilisant JavaScript? J'ai essayé le code ci-dessous et il détecte non seulement Safari, mais aussi le navigateur Chrome.
function IsSafari() {
var is_safari = navigator.userAgent.toLowerCase().indexOf('safari/') > -1;
return is_safari;
}
Réponses:
Vous pouvez facilement utiliser l'index de Chrome pour filtrer Chrome:
la source
Remarque: essayez toujours de détecter le comportement spécifique que vous essayez de corriger, au lieu de le cibler avec
isSafari?
En dernier recours, détectez Safari avec cette regex:
Il utilise des regards négatifs et exclut Chrome, Edge et tous les navigateurs Android qui incluent le
Safari
nom dans leur agent utilisateur.la source
Comme d'autres personnes l'ont déjà noté, la détection des fonctionnalités est préférable à la recherche d'un navigateur spécifique. L'une des raisons est que la chaîne de l'agent utilisateur peut être modifiée. Une autre raison est que la chaîne peut changer et casser votre code dans les versions plus récentes.
Si vous voulez toujours le faire et tester n'importe quelle version de Safari, je vous suggère d'utiliser ceci
Cela fonctionnera avec n'importe quelle version de Safari sur tous les appareils: Mac, iPhone, iPod, iPad.
Éditer
Pour tester dans votre navigateur actuel: https://jsfiddle.net/j5hgcbm2/
Modifier 2
Mise à jour selon les documents Chrome pour détecter correctement Chrome sur iOS
Il convient de noter que tous les navigateurs sur iOS ne sont que des wrappers pour Safari et utilisent le même moteur. Voir le commentaire de bfred.it sur sa propre réponse dans ce fil.
Modifier 3
Mise à jour selon la documentation de Firefox pour détecter correctement Firefox sur iOS
la source
isSafari
seratrue
dans un navigateur Safari,false
sinon. Vous pouvez simplement utiliser l'extrait ci-dessus, puis utiliser le vôtre presque comme vous l'avez publié.if (isSafari) { do_this(); } else { do_that(); }
.&& !navigator.userAgent.match('FxiOS')
une vérification similaire à Chrome - réf ( developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/… )Utilisez simplement:
la source
getUserMedia
.Ce code est utilisé pour détecter uniquement le navigateur Safari
la source
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36 OPR/24.0.1558.51 (Edition Next)
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
Étant donné que userAgent pour chrome et safari sont presque les mêmes, il peut être plus facile de regarder le fournisseur du navigateur.
Safari
Chrome
FireFox (pourquoi est-il vide?)
IE (pourquoi est-il indéfini?)
la source
Uniquement Safari sans Chrome:
Après avoir essayé d'autres codes, je n'en ai trouvé aucun qui fonctionne avec les nouvelles et anciennes versions de Safari.
Enfin, j'ai fait ce code qui fonctionne très bien pour moi:
la source
J'ai observé qu'un seul mot distingue Safari - "Version". Donc, cette regex fonctionnera parfaitement:
la source
Je ne sais pas pourquoi l'OP voulait détecter Safari, mais dans les rares cas où vous avez besoin de renifler le navigateur, il est probablement plus important de détecter le moteur de rendu que le nom du navigateur. Par exemple sur iOS, tous les navigateurs utilisent le moteur Safari / Webkit, il est donc inutile d'avoir "chrome" ou "firefox" comme nom de navigateur si le moteur de rendu sous-jacent est en fait Safari / Webkit. Je n'ai pas testé ce code avec d'anciens navigateurs mais il fonctionne avec tout ce qui est assez récent sur Android, iOS, OS X, Windows et Linux.
Clarifier:
la source
Je l'utilise
la source
Réponse la plus simple:
la source
navigator.vendor.toLowerCase().indexOf('apple') > -1
if (navigator.vendor.match(/apple/i)) { ... }
.Pour mémoire, le moyen le plus sûr que j'ai trouvé est d'implémenter la partie Safari du code de détection du navigateur à partir de cette réponse :
Bien sûr, la meilleure façon de traiter les problèmes spécifiques au navigateur est toujours de faire la détection des fonctionnalités, si possible. Cependant, utiliser un morceau de code comme celui ci-dessus est toujours meilleur que la détection de chaîne d'agent.
la source
Je sais que cette question est ancienne, mais j'ai quand même pensé à poster la réponse car cela pourrait aider quelqu'un. Les solutions ci-dessus échouaient dans certains cas extrêmes, nous avons donc dû les implémenter de manière à gérer séparément iOS, Desktop et d'autres plates-formes.
la source
Modification de l'expression régulière pour la réponse ci-dessus
la source
Ce «problème» unique est à 100% le signe que le navigateur est Safari (croyez-le ou non).
Cela signifie que le descripteur d'objet cookie est défini sur false sur Safari tandis que sur tous les autres est vrai, ce qui me donne en fait un mal de tête sur l'autre projet. Bon codage!
la source
Peut-être que cela fonctionne:
EDIT: NE FONCTIONNE PLUS
la source
Je crée une fonction qui renvoie le type booléen:
la source
Le reniflement d'agent utilisateur est vraiment délicat et peu fiable. Nous essayions de détecter Safari sur iOS avec quelque chose comme la réponse de @ qingu ci-dessus, cela fonctionnait plutôt bien pour Safari, Chrome et Firefox. Mais il a faussement détecté Opera et Edge comme Safari.
Nous avons donc opté pour la détection des fonctionnalités, car elle ressemble à ce jour,
serviceWorker
n'est prise en charge que dans Safari et dans aucun autre navigateur sur iOS. Comme indiqué dans https://jakearchibald.github.io/isserviceworkerready/Alors nous avons fait quelque chose comme
Remarque : non testé sur Safari sous MacOS.
la source