[解決済み] Safari、Chrome、IE、Firefox、Operaのブラウザを検出する方法は?
質問
FF、Chrome、IE、Opera、Safariの5つのアドオン/エクステンションを持っています。
ユーザーのブラウザを認識し、対応するアドオンをダウンロードするように(インストールボタンがクリックされたら)リダイレクトするにはどうすればよいですか?
どのように解決するのですか?
ブラウザの信頼性検知でググると、ユーザーエージェント文字列のチェックがよく出てきます。この方法は
ではなく
というのも、この値を偽装するのは簡単だからです。
でブラウザを検出する方法を書きました。
ダックタイピング
.
ブラウザ検出の方法は、拡張機能をインストールするためにブラウザ固有の手順を表示するなど、本当に必要な場合のみ使用してください。 可能な限り、機能検出を使用する。
デモの様子 https://jsfiddle.net/6spj1059/
// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';
// Safari 3.0+ "[object HTMLElementConstructor]"
var isSafari = /constructor/i.test(window.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || (typeof safari !== 'undefined' && window['safari'].pushNotification));
// Internet Explorer 6-11
var isIE = /*@cc_on!@*/false || !!document.documentMode;
// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;
// Chrome 1 - 79
var isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
// Edge (based on chromium) detection
var isEdgeChromium = isChrome && (navigator.userAgent.indexOf("Edg") != -1);
// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;
var output = 'Detecting browsers by ducktyping:<hr>';
output += 'isFirefox: ' + isFirefox + '<br>';
output += 'isChrome: ' + isChrome + '<br>';
output += 'isSafari: ' + isSafari + '<br>';
output += 'isOpera: ' + isOpera + '<br>';
output += 'isIE: ' + isIE + '<br>';
output += 'isEdge: ' + isEdge + '<br>';
output += 'isEdgeChromium: ' + isEdgeChromium + '<br>';
output += 'isBlink: ' + isBlink + '<br>';
document.body.innerHTML = output;
信頼性の分析
は
前方法
は、レンダリングエンジンのプロパティに依存していた (
-moz-box-sizing
と
-webkit-transform
) を使ってブラウザを検出します。これらの接頭辞はいずれ削除される予定なので、検出をさらに強固にするために、ブラウザ固有の特性に切り替えました。
-
インターネットエクスプローラー JScriptの
条件付きコンパイル
(IE9まで)と
document.documentMode
. -
Edge: TridentおよびEdgeブラウザーでは、Microsoftの実装が
StyleMedia
コンストラクタを使用します。Tridentを除くと、Edgeになります。 - Edge (chromiumベース)。ユーザーエージェントは、最後に "Edg/[version]"という値を含みます(例: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.16 Safari/537.36) エドッグ/80.0.361.9 ")。
-
Firefoxの場合。アドオンをインストールするためのFirefoxのAPI。
InstallTrigger
-
クローム グローバルな
chrome
オブジェクトがあり、ドキュメント化されたchrome.webstore
オブジェクトを作成します。 -
アップデート3
chrome.webstore
は最近のバージョンでは非推奨で未定義です。 -
サファリです。コンストラクタの命名に独特のパターンがある。これはリストアップされたプロパティの中で最も耐久性の低い方法ですが、どうでしょう?Safari 9.1.3では修正されています。そのため、私たちは
SafariRemoteNotification
これはバージョン 7.1 以降に導入され、3.0 以降のすべての Safaris をカバーするようになったものです。 -
オペラ
window.opera
は何年も前から存在していましたが は削除されます。 OperaがエンジンをBlink + V8 (Chromiumが使用)に置き換えたとき。 -
更新1:
Opera 15がリリースされました
そのUA文字列はChromeと似ていますが、"OPR"が加わっています。このバージョンでは
chrome
オブジェクトが定義されています(ただしchrome.webstore
がない)。OperaはChromeのクローンを作ろうと頑張るので、そのためにユーザーエージェントのスニッフィングを使っています。 -
更新2:
!!window.opr && opr.addons
を検出するために使用することができます。 Opera 20+ (エバーグリーン)です。 -
ブリンク
CSS.supports()
はBlinkで紹介されました GoogleがChrome 28に切り替えた時点で もちろん、Operaで使われているBlinkと同じものです。
でのテストに成功しました。
- Firefox 0.8 - 61
- クローム1.0 - 71
- オペラ8.0 - 34
- サファリ 3.0 - 10
- IE 6 - 11
- エッジ - 20-42
- Edge Dev - 80.0.361.9
2016年11月のアップデートで、9.1.3以降のSafariブラウザの検出が可能になりました
2018年8月に更新し、クローム、ファイヤーフォックスIE、エッジでのテストに成功した最新情報を更新しました。
2019年1月に更新し、クロームの検出を修正し(window.chrome.webstore deprecationのため)、クロームでの最新の成功テストを含めるようにしました。
2019年12月に更新し、Chromium検出をベースにEdgeを追加しました(@Nimeshのコメントに基づいています)。
関連
-
vueのグローバルがscss(mixin)を導入。
-
[解決済み] 要素外でのクリックを検出するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み] 画面サイズ、現在のウェブページ、ブラウザウィンドウのサイズを取得する
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] モバイルブラウザの検出
-
[解決済み】なぜ◎ܫ◎と☺はJavaScriptの変数名として有効ではないのでしょうか?
-
[解決済み】ブラウザのバージョンを検出する方法は?
-
[解決済み] ブラウザがファイルのダウンロードを受信したことを検出する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
要素ツリー制御によるvueTreeテーブル
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
Vueの「データを聴く」原則を解説
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】"フォームが接続されていないため、フォームの送信がキャンセルされました "というエラーの取得について
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
JavaScriptのgetElementById()メソッド入門
-
jq は html ページとデータを動的に分割する。