62 votes

Comment détecter le navigateur Chrome et Safari (Webkit)

Je suis en train d'essayer de détecter le navigateur Chrome et Safari en utilisant jQuery ou JavaScript. Je pensais que nous ne sommes pas censés utiliser jQuery.browser. Y a-t-il des suggestions ici? Merci beaucoup!

2 votes

Vous pouvez utiliser jQuery.browser, mais ce n'est pas recommandé car l'agent utilisateur peut être falsifié. Il est plutôt recommandé d'utiliser la détection de fonctionnalités, qui n'est pas falsifiable.

0 votes

Pourquoi essayez-vous de les détecter? Il y a probablement une meilleure façon que d'utiliser la détection du navigateur.

0 votes

@PeeHaa, tu penserais... mais non.

83voto

Oscar Jara Points 5104

Si vous ne souhaitez pas utiliser $.browser, regardez cas 1, sinon peut-être que cas 2 et 3 peuvent simplement vous aider à être informé car il n'est pas recommandé d'utiliser $.browser (l'agent utilisateur peut être falsifié en l'utilisant). Une alternative peut être d'utiliser jQuery.support qui détectera la prise en charge des fonctionnalités et non les informations sur l'agent.

Mais...

Si vous insistez pour obtenir le type de navigateur (juste Chrome ou Safari) mais sans utiliser $.browser, cas 1 est ce que vous recherchez...


Cela correspond à vos besoins :

Cas 1: (Pas de jQuery et pas de $.browser, juste du javascript)

Démonstration en direct: http://jsfiddle.net/oscarj24/DJ349/

var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

if (isChrome) alert("Vous utilisez Chrome !");
if (isSafari) alert("Vous utilisez Safari !");

Ces cas que j'ai utilisés auparavant ont bien fonctionné, mais ils ne sont pas recommandés...

Cas 2: (Utilisation de jQuery et de $.browser, celui-ci est délicat)

Démonstration en direct: http://jsfiddle.net/oscarj24/gNENk/

$(document).ready(function(){

    /* Obtenir le navigateur */
    $.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());

    /* Détecter Chrome */
    if($.browser.chrome){
        /* Faire quelque chose pour Chrome à ce stade */
        /* Enfin, s'il s'agit de Chrome, alors jQuery pense que c'est Safari donc nous devons lui dire que ce n'est pas le cas */
        $.browser.safari = false;
    }

    /* Détecter Safari */
    if($.browser.safari){
        /* Faire quelque chose pour Safari */
    }

});

Cas 3: (Utilisation de jQuery et de $.browser, solution "élégante")

Démonstration en direct: http://jsfiddle.net/oscarj24/uJuEU/

$.browser.chrome = $.browser.webkit && !!window.chrome;
$.browser.safari = $.browser.webkit && !window.chrome;

if ($.browser.chrome) alert("Vous utilisez Chrome !");
if ($.browser.safari) alert("Vous utilisez Safari !");

0 votes

@ ne détecterait-il pas incorrectement Rockmelt et Chromium dans le cas 3?

0 votes

Comment écririez-vous le cas 1 pour IE et FireFox?

0 votes

Votre démo échoue sous Maxthon. Il le reconnaît comme Safari car il utilise webkit.

72voto

vsync Points 11280

La plupart des réponses ici sont obsolètes, il n'y a plus de jQuery.browser, et pourquoi quelqu'un utiliserait même jQuery ou reniflerait l'Agent Utilisateur est au-delà de ma compréhension.

Au lieu de détecter un navigateur, vous devriez plutôt détecter une fonctionnalité
(si elle est prise en charge ou non).

La chose suivante est false dans Mozilla Firefox, Microsoft Edge; c'est true dans Google Chrome.

"webkitLineBreak" in document.documentElement.style

Notez que cela n'est pas durable dans le temps. Un navigateur pourrait mettre en œuvre la propriété -webkit-line-break à n'importe quel moment à l'avenir, entraînant ainsi une détection erronée. Ensuite, vous pouvez simplement regarder l'objet document dans Chrome et choisir n'importe quoi avec le préfixe webkit et vérifier que cela manque dans les autres navigateurs.

0 votes

Cela ne fonctionne pas si le navigateur prétend prendre en charge une fonctionnalité, mais la prend en charge différemment des autres navigateurs.

0 votes

Si vous avez besoin d'une détection de fonctionnalité plus robuste, mélanger plus d'un test le permettra. Vous devez choisir une fonctionnalité dont vous êtes sûr et connaître son comportement sur les autres navigateurs, et non pas une au hasard.

0 votes

Par exemple : le type d'entrée "date" en HTML5. Sur iOS WebKit, il n'y a aucun moyen de vider le champ ; donc je dois ajouter manuellement un bouton "effacer". Safari prétend comprendre Date, mais le gère incorrectement. Je ne vois aucun moyen de savoir qui le fait correctement via la détection de fonctionnalités.

11voto

Au lieu de détecter un navigateur, vous devriez plutôt détecter une fonctionnalité (si elle est prise en charge ou non). C'est ce que Modernizr fait.

Il y a bien sûr des cas où vous devez encore vérifier le navigateur car vous devez contourner un problème et non détecter une fonctionnalité. Vérification spécifique de WebKit qui n'utilise pas $.browser de jQuery :

var isWebKit = !!window.webkitURL;

Comme certains commentaires l'ont suggéré, l'approche ci-dessus ne fonctionne pas pour les anciennes versions de Safari. Mise à jour avec une autre approche suggérée dans les commentaires et par une autre réponse :

var isWebKit = 'WebkitAppearance' in document.documentElement.style;

0 votes

Vous pouvez rechercher ces fonctionnalités: stackoverflow.com/a/10176721/104380 (gardez à l'esprit qu'elles changent souvent, donc un test pourrait échouer dans un an)

2 votes

Tandis que vous avez raison que c'est la meilleure chose à faire, ce n'est pas toujours possible. Par exemple, les navigateurs webkit contiennent un bug que je souhaite contourner mais que je ne peux pas vérifier facilement. Je suis pratiquement obligé de vérifier l'agent utilisateur.

0 votes

@kybernetikos Oui, il y a de tels cas. J'ai mis à jour la réponse avec une vérification indépendante de l'agent utilisateur.

3voto

apx Points 652

/WebKit/.test(navigator.userAgent) - c'est tout.

2 votes

Malheureusement, le nouveau navigateur MS Edge se trouve dans UserAgent : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240" et ce comportement est officiellement confirmé ici

1 votes

La plupart des solutions telles que window.webkitURL et 'WebkitAppearance' n'excluront pas non plus Edge.

0 votes

Vous pouvez filtrer Edge en utilisant simplement (/WebKit/.test(navigator.userAgent) && !/Edge/.test(navigator.userAgent))

0voto

Adrian Carneiro Points 26652

JQuery fournit cela :

if ($.browser.webkit){
    ...
}

Plus d'informations sur http://api.jquery.com/jQuery.browser/

Mise à jour

Comme mentionné dans d'autres réponses/commentaires, il est toujours préférable de vérifier la prise en charge des fonctionnalités plutôt que les informations sur l'agent. jQuery fournit également un objet pour cela : jQuery.support. Consultez la documentation pour voir la liste détaillée des fonctionnalités à vérifier.

0 votes

Notez que ceci est obsolète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X