Domanda

Che cosa è il migliore / più semplice / modo più accurato per rilevare il browser di un utente?

Facilità di extendability e l'attuazione è un plus.

Meno tecnologie utilizzate, la migliore.

La soluzione può essere lato server, lato client, o entrambi.I risultati alla fine dovrebbe finire al server, però.

La soluzione può essere framework agnostico.

La soluzione verrà utilizzato solo per scopi di reporting.

È stato utile?

Soluzione

Sul server sei abbastanza limitato alla stringa UserAgent del browser (che è pieno di problemi, di avere un letto su Stringa UserAgent storia).

Sul client (cioè in Javascript), si hanno più opzioni.Ma l'opzione migliore è di non realmente preoccuparsi di lavorare fuori che il browser è.Semplicemente controllare per assicurarsi che qualsiasi funzione che si desidera utilizzare effettivamente esiste.

Per esempio, si potrebbe desiderare di utilizzare setCapture, che solo MSIE fornisce:

if (element.setCapture) element.setCapture()

Piuttosto che ciò che il browser è, e quindi la deduzione le sue capacità, stiamo semplicemente vedere se supporta qualcosa prima di utilizzarlo, chissà quali browser supportano quello che, in futuro, vuoi davvero bisogno di andare indietro e aggiornare i vostri script se Safari decide di sostenere setCapture?

Altri suggerimenti

Il JQuery Plugin Per Il Browser farlo lato client per voi.

Che cos'è jQuery Plugin per il Browser?

JQuery Plugin per il Browser è un addon per jQuery che rende facile identificare in modo univoco il browser dei visitatori.

Che cosa fa?

Ti dà un oggetto in javascript che contiene tutte le informazioni relative al browser utilizzato.Inoltre, aggiunge CSS browser selettori, il che significa che è possibile elementi di stile o funzioni di scrittura per i vari browser, versioni di browser, layout, layout di versioni, e anche i sistemi operativi.Immagine di jQuery Plugin per il Browser in azione.

Il plug-in rende $.browser disponibili, che si può inviare al server tramite una chiamata AJAX, se si ha realmente bisogno server-side.

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

Il plug-in sarà solo essere efficace quanto il browser è stato testato contro, tuttavia.Il plugin sopra elencato è un elenco di browser riconosciuto nel test, ma c'è sempre il rischio che un nuovo browser verrà furtivamente fuori (Google Chrome..) che richiedono una ri-scrittura del le norme di riconoscimento.Detto questo, il plug-in sembra essere regolarmente aggiornato.

Quando si utilizza javascript: Non utilizzare il rilevamento del browser

Scrivere il codice che prova per determinati casi esposti dai browser, altrimenti ti basta scrivere il codice per un molto, molto piccola della popolazione.È meglio utilizzare "typeof foo == 'undefined'" e il browser trucchi specifici cui hai bisogno.

jQuery questo in tutto il suo codebase ( se guardi il codice vedrai che l'attuazione di comportamenti per i diversi browser tecnologie )

Il suo meglio nel lungo periodo.

Dato che ho appena postato questo in un (ora eliminata in questione), ed è ancora nei miei appunti, mi limiterò a pubblicare.Nota:questo è un server-side PHP soluzione

Io attualmente uso il seguente codice per questo.Non è quasi un'estenuante soluzione, ma dovrebbe essere facile da implementare più browser.Non sapevo user-agents.org (grazie PConroy), "uno di questi giorni" io loop attraverso di esso e vedere se sono in grado di aggiornare e aggiungere alla mia lista.

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;
  }
}

Dan ha detto:dipende dalla tecnologia utilizzata.

Per PHP lato server il rilevamento del browser mi consiglia di Harald Speranza di rilevamento del Browser:

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

Pubblicato sotto la licenza GPL.

Non utilizzare il rilevamento del browser:

  • Il rilevamento del Browser non è affidabile al 100%, il più delle volte, ma le cose peggiorano di questo:
  • Ci sono un sacco di varianti di browser (MSIE personalizzazioni ecc)
  • Browser può mentire sulla propria identità (Opera effettivamente ha questa funzione built-in)
  • Gateway di nascondere o occultare il browser identità
  • La personalizzazione e fornitori di gateway di scrivere i loro propri rifiuti in USER_AGENT

Meglio non fare il rilevamento delle funzionalità in script client.Si spera solo bisogno di rilevamento del browser per risolvere un bug in uno specifico browser e versione.

Originariamente ho fatto la domanda perché voglio essere in grado di registrare i browser e sistemi operativi le persone utilizzano per accedere al mio sito.Sì, la stringa agente utente non può essere attendibile, e sì, non si dovrebbe usare il browser di rilevamento per determinare ciò che l'esecuzione di codice in JS, ma, mi piacerebbe avere il più accurata possibile le statistiche.

Ho fatto la seguente.

Sto utilizzando una combinazione di JavaScript e PHP per registrare le statistiche.JavaScript per determinare che tipo di browser e sistema operativo (come questo è probabilmente i più precisi), e PHP per registrare:

Il codice JavaScript viene da Quirksmode, PHP è piuttosto evidente.Io uso il MooTools Framework JS.

Aggiungere il codice seguente al BrowserDetect script:

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();
    }
});

Questo determina il browser, la versione del browser e del sistema operativo del browser dell'utente e lo invia al record_browser.php script.Il record_browser.php script basta aggiungere l'informazione, insieme con il PHP session_id e l'attuale user_id, se presente.

Tabella 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`)
)

Codice 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
                ));
}

Come detto da molti, il rilevamento del browser possono andare molto male...tuttavia, nell'interesse di Codice di Golf.

Questo è un modo molto veloce per rilevare IE.

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

Il suo abbastanza carino da dire, anche perché si sceglie CIOÈ senza intervento su Opera.

I punti di Bonus se si conosce perché questo funziona in IE.;-)

Questo è il codice C # che uso, spero possa essere 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 );

Modifica:La soluzione qui di seguito non è raccomandato.Invece, provare questo: http://whichbrowser.net/

Questa volta ha funzionato per me, ma guardando il codice ora, non ho idea di come.Sopra invece :-/

<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>

Non dimenticate che è necessario per l'inizializzazione di utilizzarlo, in modo da mettere questo codice:

var UserBrowser = new BrowserCheck();

E quindi controllare per un tipo e versione del browser in questo modo:(ad es.Internet Explorer 8)

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

ecc.

Spero che lo faccia il lavoro per voi, come per noi, ma ricordate che nessun rilevamento del browser è a prova di proiettile!

Per internet explorer e fogli di Stile è possibile utilizzare la seguente sintassi:

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

Questo vale per IE 6 o versioni precedenti.È possibile modificare la versione di IE e dispongono di:

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

Im non sicuro se questo funziona con le altre parti della pagina ma non funziona quando viene inserito all'interno del <head> tag.Vedere questo esempio per ulteriori informazioni

Generalmente, quando un browser effettua una richiesta, invia un mucchio di informazioni (data, nome, data, user-agent...).Si dovrebbe provare a guardare le intestazioni inviato al client e andare per quello che ti dice il loro browser (credo sia "User-Agent:".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top