2010-06-03 3 views
2

Je serais intéressé de savoir quel serait le meilleur endroit pour détecter l'agent utilisateur du client, côté client (javascript) ou côté serveur? J'ai soulevé la question en raison du fait que certains utilisateurs d'IE8 reçoivent un message disant qu'ils utilisent IE6.Quelle est la meilleure façon de détecter l'agent utilisateur d'un client?

+0

tangentiellement Note concernant: L'agent utilisateur dit MSIE 7.0 au lieu de MSIE 8.0 lors de l'utilisation vue de la compatibilité dans IE8. – Brian

Répondre

8

La réponse courte et correcte est: n'utilisez rien qui repose sur le reniflage UserAgent.

Pour être en mesure d'ajuster les chemins de code, vous devez tester la 'chose' spécifique à laquelle le chemin de code est ajusté, principalement les caractéristiques. C'est ce qu'on appelle Feature Detection. Donc, si la fonctionnalité X est supportée, nous le faisons, sinon nous le faisons. Déduire si une fonctionnalité est prise en charge sur la base de quel UserAgent est présent échouera rapidement, en particulier lorsque de nouveaux navigateurs sont marqués.
Prenons l'exemple suivant, qui peut effectivement être trouvée dans plusieurs grandes bibliothèques (!)

if (isIE8) { 
    // use new feature provided by IE8 
} else if (isIE7) { 
    // use not so new feature provided by IE7 (and IE8) 
} else { 
    // use fallback for all others (which also works in IE7 and IE8) 
} 

Que pensez-vous qui se passe quand IE9 arrive?

Le modèle correct dans ce cas serait

if ("addEventListener" in foo) { 
    // use DOM level 2 addEventListener to attach events 
    foo.addEventListener(... 
} else if ("attachEvent" in foo) { 
    // use IE's proprietary attachEvent method 
    foo.attachEvent(... 
} else { 
    // fall back to DOM 0 
    foo["on" + eventName] = .... 
} 
+0

Alors, quelle serait la meilleure façon de résoudre ce problème? – westoque

+2

em .. l'enlever? Le code doit utiliser la fonction de détection de fonction et non UserAgent Sniffing pour adapter ses chemins de code –

+0

+1. Sean a absolument raison. L'article de Peter Michaux sur la détection de caractéristiques est un bon point de départ: http://michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting –

5

L'agent utilisateur disponible sur les deux côtés doit être le même, à moins qu'il ne se passe des choses amusantes, ce qui n'est normalement pas le cas.

Si vous souhaitez afficher un message aux utilisateurs IE6, je vous suggère d'utiliser conditionalcomments. Ils sont une fonctionnalité spécifique à IE et fonctionnent très bien pour détecter les versions IE.

+0

+1 pour l'utilisation de commentaires conditionnels pour détecter la version IE. – Brian

0

Les informations trouvées par la détection côté client ou serveur est fondamentalement la même. Gardez à l'esprit qu'il est extrêmement facile d'usurper le navigateur dans lequel vous vous trouvez. Il n'y a aucun moyen sûr de détecter tous les types de navigateur avec précision.

0

je ne sais pas comment vous vérifiez pour l'agent utilisateur, mais je ferais de cette façon:

<%= 
case request.env['HTTP_USER_AGENT'] 
when /Safari/ 
    "it's a Mac!" 
when /iPhone/ 
    "it's a iPhone" 
else 
    "i don't know :(" 
end 
%> 

vérifier directement dans la requête de l'utilisateur semble être la façon la plus cohérente pour vérifier la navigateur de l'utilisateur. Et le request.env est disponible dans votre contrôleur et vos vues, donc vous pouvez le passer à rjs si nécessaire.

0

Pour ceux qui besoin pour obtenir l'agent utilisateur réel en utilisant JavaScript, vous pouvez utiliser navigator.userAgent

Questions connexes