Question

Quel est le moyen le plus simple, le plus précis et le plus précis de détecter le navigateur d'un utilisateur?

La facilité d'extension et de mise en œuvre est un atout.

Moins on utilise de technologies, mieux c'est.

La solution peut être côté serveur, côté client ou les deux. Cependant, les résultats devraient finir sur le serveur.

La solution peut être agnostique vis-à-vis du framework.

La solution ne sera utilisée qu'à des fins de génération de rapports.

Était-ce utile?

La solution

Sur le serveur, vous êtes plutôt limité à la chaîne UserAgent fournie par le navigateur (qui pose de nombreux problèmes. Consultez la section Historique de la chaîne UserAgent ).

Sur le client (c'est-à-dire en Javascript), vous avez plus d'options. Mais la meilleure option est de ne pas s’inquiéter de savoir de quel navigateur il s’agit. Vérifiez simplement que la fonctionnalité que vous souhaitez utiliser existe réellement.

Par exemple, vous pouvez utiliser setCapture, que seul MSIE fournit:

if (element.setCapture) element.setCapture()

Plutôt que de définir le navigateur, puis de déduire ses capacités, nous vérifions simplement s'il prend en charge quelque chose avant de l'utiliser: qui sait quels navigateurs prendront en charge ce que vous ferez à l'avenir, voulez-vous vraiment et mettre à jour vos scripts si Safari décide de prendre en charge setCapture?

Autres conseils

Le plug-in de navigateur JQuery le fera côté client pour vous.

  

Qu'est-ce que le plug-in de navigateur jQuery?

     

Le plug-in de navigateur jQuery est un addon pour jQuery qui permet d'identifier facilement les navigateurs de vos visiteurs.

     

Qu'est-ce que cela fait?

     

Il vous donne un objet en javascript contenant toutes les informations sur le navigateur utilisé. Il ajoute également des sélecteurs de navigateur CSS, ce qui signifie que vous pouvez styler des éléments ou écrire des fonctions pour des navigateurs spécifiques, des versions de navigateur, des présentations, des versions de présentation et même des systèmes d'exploitation. Image du plug-in de navigateur jQuery en action.

Le plug-in rend $.browser disponible, vous pouvez le soumettre à nouveau à votre serveur via un appel AJAX, si vous en avez vraiment besoin côté serveur.

alert($.browser.name);  // Alerts Firefox for me

Toutefois, le plug-in sera aussi efficace que les navigateurs avec lesquels il a été testé. Le plug-in répertorié ci-dessus contient une liste des navigateurs reconnus dans ses tests , mais le risque existe toujours. qu'un nouveau navigateur apparaîtra ( Google Chrome .. ), ce qui nécessitera une réécriture de la règles de reconnaissance. Cela dit, ce plug-in semble être mis à jour régulièrement.

Lors de l'utilisation de javascript: N'utilisez pas la détection de navigateur

Écrivez un code qui se teste lui-même pour les cas donnés présentés par les navigateurs. Sinon, vous écrirez simplement du code pour une très petite population. Il vaut mieux utiliser "typeof foo == 'undefined'" des astuces spécifiques à votre navigateur, là où vous en avez besoin.

jQuery fait cela partout dans sa base de code (si vous regardez le code, vous verrez qu'il implémente des comportements pour différentes technologies de navigateur)

C'est meilleur à long terme.

Comme je viens de poster ceci dans une question (maintenant supprimée) et qu'il est toujours dans mon tampon de collage, je vais simplement le republier. Remarque: il s'agit d'une solution PHP côté serveur

J'utilise actuellement le code suivant pour cela. Ce n'est pas presque une solution épuisante, mais il devrait être facile d'implémenter plus de navigateurs. Je ne connaissais pas user-agents.org (merci PConroy), & "; L'un des ces jours-ci " Je vais faire une boucle pour voir si je peux mettre à jour et ajouter à ma liste.

define("BROWSER_OPERA","Opera");
define("BROWSER_IE","IE");
define("BROWSER_OMNIWEB","Omniweb");
define("BROWSER_KONQUEROR","Konqueror");
define("BROWSER_SAFARI","Safari");
define("BROWSER_MOZILLA","Mozilla");
define("BROWSER_OTHER","other");

$aBrowsers = array
(
  array("regexp" => "@Opera(/| )([0-9].[0-9]{1,2})@", "browser" => BROWSER_OPERA, "index" => 2),
  array("regexp" => "@MSIE ([0-9].[0-9]{1,2})@", "browser" => BROWSER_IE, "index" => 1),
  array("regexp" => "@OmniWeb/([0-9].[0-9]{1,2})@", "browser" => BROWSER_OMNIWEB, "index" => 1),
  array("regexp" => "@(Konqueror/)(.*)(;)@", "browser" => BROWSER_KONQUEROR, "index" => 2),
  array("regexp" => "@Safari/([0-9]*)@", "browser" => BROWSER_SAFARI, "index" => 1),
  array("regexp" => "@Mozilla/([0-9].[0-9]{1,2})@", "browser" => BROWSER_MOZILLA, "index" => 1)
);

foreach($aBrowsers as $aBrowser)
{
  if (preg_match($aBrowser["regexp"], $_SERVER["HTTP_USER_AGENT"], $aBrowserVersion))
  {
    define("BROWSER_AGENT",$aBrowser["browser"]);
    define("BROWSER_VERSION",$aBrowserVersion[$aBrowser["index"]]);
    break;
  }
}

comme l'a dit Dan: cela dépend de la technologie utilisée.

Pour la détection de navigateur côté serveur PHP, je recommande la détection de navigateur de Harald Hope:

http://techpatterns.com/downloads/php_browser_detection.php

Publié sous GPL.

N'utilisez pas la détection de navigateur:

  • La détection du navigateur n’est pas fiable à 100% dans le meilleur des cas, mais la situation est encore pire:
  • Il existe de nombreuses variantes de navigateurs (personnalisations MSIE, etc.)
  • Les navigateurs peuvent mentir sur leur identité (cette fonctionnalité est intégrée dans Opera)
  • Les passerelles cachent ou masquent l'identité du navigateur
  • Les fournisseurs de passerelles et de personnalisation écrivent leurs propres déchets dans USER_AGENT

Il est préférable de détecter les fonctionnalités dans le script client. Espérons que vous n’auriez besoin que de la détection du navigateur pour contourner un bogue dans un navigateur et une version spécifiques.

À l'origine, je posais la question parce que je souhaitais pouvoir enregistrer les navigateurs et les systèmes d'exploitation utilisés par les utilisateurs pour accéder à mon site. Oui, la chaîne de l'agent utilisateur ne peut pas être approuvée et vous ne devriez pas utiliser la détection de navigateur pour déterminer le code à exécuter dans JS, mais j'aimerais disposer de statistiques aussi précises que possible.

J'ai fait ce qui suit.

J'utilise une combinaison de JavaScript et de PHP pour enregistrer les statistiques. JavaScript pour déterminer quel navigateur et quel système d’exploitation (car c’est probablement le plus précis), et PHP pour l’enregistrer:

Le code JavaScript provient de Quirksmode , le code PHP est assez évident. J'utilise le framework JS MooTools .

Ajoutez les éléments suivants au script BrowserDetect:

window.addEvent('domready', function() {
    if (BrowserDetect) {
        var q_data = 'ajax=true&browser=' + BrowserDetect.browser + '&version=' + BrowserDetect.version + '&os=' + BrowserDetect.OS;
        var query = 'record_browser.php'
        var req = new Request.JSON({url: query, onComplete: setSelectWithJSON, data: q_data}).post();
    }
});

Ceci détermine le navigateur, la version du navigateur et le système d'exploitation du navigateur de l'utilisateur, et l'envoie au script record_browser.php. Le script session_id ajoute simplement les informations, ainsi que PHP user_id et l'actuel <=>, le cas échéant.

Table MySQL:

CREATE TABLE `browser_detects` (
  `id` int(11) NOT NULL auto_increment,
  `session` varchar(255) NOT NULL default '',
  `user_id` int(11) NOT NULL default '0',
  `browser` varchar(255) NOT NULL default '',
  `version` varchar(255) NOT NULL default '',
  `os` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `sessionUnique` (`session`)
)

Code PHP:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $session = session_id();
    $user_id = isset($user_id) ? $user_id ? 0;
    $browser = isset($_POST['browser']) ? $_POST['browser'] ? '';
    $version = isset($_POST['version']) ? $_POST['version'] ? '';
    $os = isset($_POST['os']) ? $_POST['os'] ? '';
    $q = $conn->prepare('INSERT INTO browser_detects (`session`, `user`, `browser`, `version`, `os`) VALUES (:session :user, :browser, :version, :os)');
    $q->execute(array(
                    ':session' => $session,
                    ':user' => $user_id,
                    ':browser' => $browser,
                    ':version' => $version,
                    ':os' => $os
                ));
}

Comme beaucoup l'ont indiqué, la détection de navigateur Web peut très mal tourner ... mais dans l'intérêt de Code Golf.

C’est un moyen très rapide de détecter IE.

<script>
  if('\v'=='v'){
    alert('I am IE');
  } else {
    alert('NOT IE');
  }
</script>

C’est plutôt chouette en fait parce qu’il choisit IE sans trébucher sur Opera.

Bonus de points si vous savez pourquoi cela fonctionne dans IE. ; -)

C’est le code C # que j’utilise et qui, je l’espère, sera utile.

StringBuilder strb = new StringBuilder();
strb.AppendFormat ( "User Agent: {0}{1}", Request.ServerVariables["http_user_agent"].ToString(), Environment.NewLine );
strb.AppendFormat ( "Browser: {0}{1}", Request.Browser.Browser.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Version: {0}{1}", Request.Browser.Version.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Major Version: {0}{1}", Request.Browser.MajorVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Minor Version: {0}{1}", Request.Browser.MinorVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Platform: {0}{1}", Request.Browser.Platform.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "ECMA Script version: {0}{1}", Request.Browser.EcmaScriptVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Type: {0}{1}", Request.Browser.Type.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "-------------------------------------------------------------------------------{0}",  Environment.NewLine );
strb.AppendFormat ( "ActiveX Controls: {0}{1}", Request.Browser.ActiveXControls.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Background Sounds: {0}{1}", Request.Browser.BackgroundSounds.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "AOL: {0}{1}", Request.Browser.AOL.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Beta: {0}{1}", Request.Browser.Beta.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "CDF: {0}{1}", Request.Browser.CDF.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "ClrVersion: {0}{1}", Request.Browser.ClrVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Cookies: {0}{1}", Request.Browser.Cookies.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Crawler: {0}{1}", Request.Browser.Crawler.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Frames: {0}{1}", Request.Browser.Frames.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Tables: {0}{1}", Request.Browser.Tables.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "JavaApplets: {0}{1}", Request.Browser.JavaApplets.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "JavaScript: {0}{1}", Request.Browser.JavaScript.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "MSDomVersion: {0}{1}", Request.Browser.MSDomVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "TagWriter: {0}{1}", Request.Browser.TagWriter.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "VBScript: {0}{1}", Request.Browser.VBScript.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "W3CDomVersion: {0}{1}", Request.Browser.W3CDomVersion.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Win16: {0}{1}", Request.Browser.Win16.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "Win32: {0}{1}", Request.Browser.Win32.ToString ( ), Environment.NewLine );
strb.AppendFormat ( "-------------------------------------------------------------------------------{0}", Environment.NewLine );
strb.AppendFormat ( "MachineName: {0}{1}", Environment.MachineName, Environment.NewLine );
strb.AppendFormat ( "OSVersion: {0}{1}", Environment.OSVersion, Environment.NewLine );
strb.AppendFormat ( "ProcessorCount: {0}{1}", Environment.ProcessorCount, Environment.NewLine );
strb.AppendFormat ( "UserName: {0}{1}", Environment.UserName, Environment.NewLine );
strb.AppendFormat ( "Version: {0}{1}", Environment.Version, Environment.NewLine );
strb.AppendFormat ( "UserInteractive: {0}{1}", Environment.UserInteractive, Environment.NewLine );
strb.AppendFormat ( "UserDomainName: {0}{1}", Environment.UserDomainName, Environment.NewLine );

Modifier : la solution ci-dessous n'est pas recommandée. Essayez plutôt ceci: http://whichbrowser.net/

Cela a déjà fonctionné pour moi, mais en regardant le code maintenant, je ne sais pas comment. Utilisez ce qui précède à la place: - /

<script type="text/javascript">
    // <![CDATA[
    var BrowserCheck = Class.create({
        initialize: function () {
            var userAgent = navigator.userAgent.toLowerCase();
            this.version = (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1];
            this.safari = /webkit/.test(userAgent) && !/chrome/.test(userAgent);
            this.opera = /opera/.test(userAgent);
            this.msie = /msie/.test(userAgent) && !/opera/.test(userAgent);
            this.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent);
            this.chrome = /chrome/.test(userAgent);
        }
    });    
    // ]]>
</script>

N'oubliez pas que vous devez l'initialiser pour l'utiliser, alors mettez ceci dans votre code:

var UserBrowser = new BrowserCheck();

Ensuite, vérifiez le type et la version du navigateur de la manière suivante: (par exemple, Internet Explorer 8)

if ((UserBrowser.msie == true) && (UserBrowser.version == 8))

etc.

J'espère que cela fera le travail pour vous comme il l'a fait pour nous, mais souvenez-vous qu'aucune détection de navigateur n'est à l'épreuve des balles!

Pour Internet Explorer et les feuilles de style, vous pouvez utiliser la syntaxe suivante:

<!--[if lte IE 6]><link href="/style.css" rel="stylesheet" type="text/css" /><![endif]-->

Ceci s’applique à IE 6 ou aux versions antérieures. Vous pouvez changer la version d'IE et également:

<!--[if eq IE 7]> = Equal too IE 7
<!--[if gt IE 6]> = Greater than IE 6

Je ne suis pas sûr que cela fonctionne avec d'autres parties de la page, mais fonctionne lorsqu'il est placé dans la balise <head>. Consultez cet exemple pour plus d'informations

.

Généralement, quand un navigateur fait une demande, il vous envoie une foule d’informations (heure, nom, date, agent utilisateur, etc.). Vous devriez essayer de regarder les en-têtes que le client a envoyés et aller à celui qui vous dit son navigateur (je pense que c'est & "User-Agent: &";.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top