質問
ユーザーのブラウザを検出するための最良/最も簡単/最も正確な方法は何ですか?
拡張性と実装が容易であることも利点です。
使用するテクノロジーは少ないほど良いのです。
ソリューションはサーバー側、クライアント側、またはその両方で行うことができます。ただし、結果は最終的にサーバーに到達するはずです。
このソリューションはフレームワークに依存しない可能性があります。
このソリューションはレポート目的でのみ使用されます。
解決
サーバー上では、ブラウザーが提供する UserAgent 文字列にほとんど制限されます (これには問題がたくさんあります。 UserAgent 文字列の履歴).
クライアント (つまり、JavaScript) では、さらに多くのオプションがあります。しかし、最善の選択肢は、どのブラウザであるかを実際に心配しないことです。使用したい機能が実際に存在するかどうかを確認するだけです。
たとえば、MSIE のみが提供する setCapture を使用するとよいでしょう。
if (element.setCapture) element.setCapture()
ブラウザが何であるかを調べてその機能を推測するのではなく、使用する前に何かをサポートしているかどうかを単純に確認しています。将来どのブラウザが何をサポートするかは誰にもわかりません。本当に戻って更新する必要がありますか? Safari が setCapture をサポートすることに決めた場合、スクリプトはどうなりますか?
他のヒント
の JQueryブラウザプラグイン クライアント側でそれを実行します。
jQuery ブラウザ プラグインとは何ですか?
jQuery ブラウザ プラグインは、訪問者のブラウザを簡単に一意に識別できるようにする jQuery のアドオンです。
それは何をするためのものか?
使用されているブラウザに関するすべての情報を含むオブジェクトを JavaScript で提供します。また、CSS ブラウザー セレクターも追加されます。つまり、要素をスタイル設定したり、特定のブラウザー、ブラウザー バージョン、レイアウト、レイアウト バージョン、さらにはオペレーティング システム用の関数を記述したりできます。jQuery ブラウザ プラグインが動作している画像。
プラグインにより、 $.browser
サーバー側で本当に必要な場合は、AJAX 呼び出しを介してサーバーに再送信できます。
alert($.browser.name); // Alerts Firefox for me
ただし、プラグインの効果は、テストされたブラウザーと同等に限られます。上記のプラグインには次のリストがあります。 テストで認識されたブラウザ, 、しかし、新しいブラウザがこっそり登場するリスクは常にあります (グーグルクローム..) 認識ルールを書き直す必要があります。とはいえ、このプラグインは定期的に更新されているようです。
JavaScriptを使用する場合: ブラウザ検出を使用しない
ブラウザーによって表示される特定のケースに対して自身をテストするコードを作成します。そうしないと、単に非常に少数の母集団に対してコードを作成することになります。使った方が良いですよ "typeof foo == 'undefined'"
必要に応じてブラウザ固有のトリックも提供します。
jQuery はこれをコードベース全体で実行します (コードを見ると、さまざまなブラウザー技術の動作を実装していることがわかります)。
長期的にはその方が良いです。
これを (現在削除された質問) に投稿したばかりで、まだ貼り付けバッファーにあるため、再投稿します。注記:これはサーバー側の PHP ソリューションです
現在、これには次のコードを使用しています。これは、ほとんど面倒な解決策ではありませんが、より多くのブラウザを簡単に実装できるはずです。知らなかった ユーザーエージェント.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;
}
}
ダンが言ったように:それは使用されるテクノロジーによって異なります。
PHP サーバー側のブラウザ検出には、Harald Hope のブラウザ検出をお勧めします。
http://techpatterns.com/downloads/php_browser_detection.php
GPL に基づいて公開されています。
ブラウザ検出を使用しないでください。
- ブラウザの検出は、最良の場合でも 100% 信頼できるわけではありませんが、状況はこれより悪化します。
- ブラウザにはたくさんのバリエーションがあります (MSIE のカスタマイズなど)
- ブラウザは自分の身元を偽ることができます (Opera には実際にこの機能が組み込まれています)
- ゲートウェイはブラウザの ID を隠すか難読化します
- カスタマイズおよびゲートウェイのベンダーは、USER_AGENT に独自のゴミを書き込む
クライアントスクリプトで機能検出を行う方が良いでしょう。ブラウザ検出が必要なのは、特定のブラウザとバージョンのバグを回避する場合のみであることが望ましいです。
私がこの質問をしたのは、人々が私のサイトにアクセスするために使用するブラウザとオペレーティング システムを記録できるようにしたいためです。はい、ユーザー エージェント文字列は信頼できません。また、JS で実行するコードを決定するためにブラウザー検出を使用すべきではありません。しかし、できるだけ正確な統計が必要です。
私は次のことを行いました。
JavaScript と PHP を組み合わせて統計を記録しています。ブラウザと OS を決定するための JavaScript (これは おそらく 最も正確です)、PHP でそれを記録します。
JavaScript の由来は、 癖モード, 、PHP はむしろ自明です。私が使用するのは、 ムーツール JSフレームワーク。
以下を 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
脚本。の record_browser.php
スクリプトは PHP とともに情報を追加するだけです session_id
そして現在 user_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
));
}
多くの人が述べているように、ブラウザの検出は非常に間違っている可能性があります...ただし、コードゴルフの利益のために。
これは IE を非常に高速に検出する方法です。
<script>
if('\v'=='v'){
alert('I am IE');
} else {
alert('NOT IE');
}
</script>
Opera でつまずくことなく IE を選択するので、実際には非常に優れています。
知っていればボーナスポイント なぜ これはIEで動作します。;-)
これは私が使用している 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 );
編集:以下の解決策は推奨されません。代わりにこれを試してください: http://どのブラウザ.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))
等
私たちと同じように、あなたにとってもこの機能が機能することを願っていますが、ブラウザーの検出は完全ではないことを忘れないでください。
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>
鬼ごっこ。これを参照してください 例 詳細については
一般に、ブラウザがリクエストを行うと、大量の情報 (時刻、名前、日付、ユーザー エージェントなど) が送信されます。クライアントが送信したヘッダーを調べて、ブラウザーを示すヘッダー (「User-Agent:」だと思います) にアクセスしてください。