10

ユーザーのブラウザを検出するための最良/最も簡単/最も正確な方法は何ですか?

拡張性と実装の容易さはプラスです。

使用するテクノロジーが少ないほど良い。

ソリューションは、サーバー側、クライアント側、またはその両方にすることができます。ただし、結果は最終的にサーバーに届くはずです。

ソリューションは、フレームワークに依存しない場合があります。

このソリューションは、レポート目的でのみ使用されます。

4

12 に答える 12

12

サーバーでは、ブラウザが提供するUserAgent文字列にかなり制限されています(これには問題があります。UserAgent文字列の履歴を読んでください)。

クライアント(つまりJavascript)では、より多くのオプションがあります。しかし、最善のオプションは、それがどのブラウザであるかを実際に気にしないことです。使用したい機能が実際に存在することを確認するだけです。

たとえば、MSIEのみが提供するsetCaptureを使用したい場合があります。

if (element.setCapture) element.setCapture()

ブラウザが何であるかを理解してからその機能を推測するのではなく、使用する前にそれが何かをサポートしているかどうかを確認しているだけです-将来どのブラウザが何をサポートするかを知っている人は、本当に戻って更新する必要がありますか? SafariがsetCaptureをサポートすることを決定した場合のスクリプト?

于 2008-09-19T10:17:12.400 に答える
6

JQuery Browser Pluginは、クライアント側でそれを行います。

jQuery ブラウザ プラグインとは何ですか?

jQuery Browser Plugin は、訪問者のブラウザーを簡単に識別できるようにする jQuery のアドオンです。

それは何をするためのものか?

使用されているブラウザに関するすべての情報を含む JavaScript のオブジェクトを提供します。また、CSS ブラウザー セレクターも追加されます。つまり、要素のスタイルを設定したり、特定のブラウザー、ブラウザー バージョン、レイアウト、レイアウト バージョン、さらにはオペレーティング システム用の関数を記述したりできます。jQuery Browser Plugin の動作中の画像。

プラグインは$.browser、サーバー側で本当に必要な場合に、AJAX 呼び出しを介してサーバーに再送信できるプラグインを利用可能にします。

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

ただし、プラグインは、テストされたブラウザと同じくらい効果的です. 上記のプラグインには、そのテストで認識されたブラウザのリストがありますが、認識ルールの書き直しが必要になる新しいブラウザ ( Google Chrome.. )が忍び寄るリスクが常にあります。とはいえ、このプラグインは定期的に更新されているようです。

于 2008-09-19T10:14:01.050 に答える
2

javascriptを使用する場合:ブラウザ検出を使用しないでください

ブラウザによって示される特定のケースについて自分自身をテストするコードを記述します。そうしないと、非常に少数の人口のコードを記述することになります。"typeof foo == 'undefined'"必要な場所で特定のトリックを使用してブラウザを使用することをお勧めします。

jQueryはコードベース全体でこれを実行します(コードを見ると、さまざまなブラウザー技術の動作を実装していることがわかります)

長期的にはより良いです。

于 2008-09-19T10:21:41.123 に答える
1

これを(現在削除された質問)に投稿したばかりで、まだ貼り付けバッファにあるので、再投稿します。注: これはサーバー側の PHP ソリューションです

現在、これには次のコードを使用しています。これはほとんど面倒な解決策ではありませんが、より多くのブラウザーを簡単に実装できるはずです。私はuser-agents.orgについて知りませんでした (PConroy に感謝します)。"最近" ループして、更新してリストに追加できるかどうかを確認します。

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;
  }
}
于 2008-09-19T10:16:27.660 に答える
0

ブラウザ検出を使用しないでください:

  • ブラウザの検出は、最良の場合、100%信頼できるわけではありませんが、状況はこれよりも悪化します。
  • ブラウザにはさまざまなバリエーションがあります(MSIEのカスタマイズなど)
  • ブラウザは自分の身元について嘘をつくことができます(Operaには実際にこの機能が組み込まれています)
  • ゲートウェイは、ブラウザのIDを非表示または難読化します
  • カスタマイズおよびゲートウェイベンダーは、USER_AGENTに独自のゴミを書き込みます

client-scriptで機能検出を行うことをお勧めします。うまくいけば、特定のブラウザとバージョンのバグを回避するために必要なのはブラウザ検出だけです。

于 2008-09-19T20:32:07.310 に答える
0

人々が私のサイトにアクセスするために使用するブラウザと運用システムを記録できるようにしたいので、私は最初に質問をしました。はい、ユーザーエージェント文字列は信頼できません。はい、ブラウザ検出を使用してJSで実行するコードを決定するべきではありませんが、可能な限り正確な統計情報が必要です。

私は次のことをしました。

統計を記録するためにJavaScriptとPHPの組み合わせを使用しています。どのブラウザとOSを決定するためのJavaScript(これがおそらく最も正確であるため)、およびそれを記録するためのPHP:

JavaScriptはQuirksmodeから来ており、PHPはかなり自明です。私はMooToolsJSフレームワークを使用しています。

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

これにより、ユーザーのブラウザーのブラウザー、ブラウザーのバージョン、およびOSが判別され、record_browser.phpスクリプトに送信されます。スクリプトは、PHPと現在の情報(存在する場合record_browser.php)とともに情報を追加するだけです。session_iduser_id

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

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
                ));
}
于 2008-09-25T12:13:48.207 に答える
0

これは私が使用しているC#コードです。お役に立てば幸いです。

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 );
于 2011-01-10T19:43:42.790 に答える
0

編集:以下の解決策はお勧めしません。代わりにこれを試してください: http://whichbrowser.net/

これはかつて私にとってはうまくいきましたが、今コードを見ると、その方法がわかりません。代わりに上記を使用してください:-/

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

使用するには初期化する必要があることを忘れないでください。コードに次のように記述してください。

var UserBrowser = new BrowserCheck();

次に、ブラウザーの種類とバージョンを次のように確認します: (例: Internet Explorer 8)

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

それが私たちのようにあなたのために仕事をしてくれることを願っていますが、ブラウザーの検出は絶対的な証拠ではないことを覚えておいてください!

于 2010-06-08T16:37:34.337 に答える
0

多くの人が述べているように、ブラウザの検出は非常にうまくいかない可能性があります...ただし、Code Golf の利益のためです。

これは、IE を検出するための非常に高速な方法です。

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

Opera でつまずくことなく IE を選択するため、実際には非常に優れています。

これがIEで機能する理由を知っていれば、ボーナスポイントです。;-)

于 2009-04-14T17:44:09.603 に答える
0

ダンが言ったように:それは使用される技術に依存します.

PHP サーバー側のブラウザー検出には、Harald Hope のブラウザー検出をお勧めします。

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

GPL で公開されています。

于 2008-09-19T10:15:17.507 に答える
-1

通常、ブラウザがリクエストを行うと、一連の情報(時刻、名前の日付、ユーザーエージェントなど)が送信されます。クライアントが送信したヘッダーを確認して、ブラウザーを通知するヘッダーに移動する必要があります(「User-Agent:」だと思います。

于 2008-09-25T12:17:47.353 に答える
-1

Internet Explorer とスタイル シートの場合、次の構文を使用できます。

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

これは IE 6 以前に適用されます。IE のバージョンを変更して、次のこともできます。

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

これがページの他の部分で機能するかどうかはわかりませんが、<head>タグ内に配置すると機能します。詳細については、このを参照してください

于 2008-09-19T20:25:39.883 に答える