ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript はブラウザの種類と version_javascript スキルを決定します

JavaScript はブラウザの種類と version_javascript スキルを決定します

WBOY
リリース: 2016-05-16 18:55:38
オリジナル
1162 人が閲覧しました

数日前、Google が発売した Chrome ブラウザ ファミリーに星の王子さまが誕生しました。クロムは名家に生まれたため、まだ幼いながらも誰も彼を軽蔑する者はいなかった。これからは、ブラウザの「4 つの才能」を「5 つの黄金の花」に改名する必要があるとよく言われます。
Webサイトのフロントエンド開発では、ブラウザの互換性の問題ですでに大慌てですが、Chromeの誕生でさらに苦労することになります。ブラウザの互換性は、フロントエンド開発フレームワークによって解決される最初の問題です。互換性の問題を解決するには、まずブラウザの種類とバージョンを正確に判断する必要があります。
JavaScript はフロントエンド開発の主な言語です。JavaScript プログラムを作成することでブラウザの種類とバージョンを決定できます。 JavaScript がブラウザの種類を判断するには、一般に 2 つの方法があります。1 つはさまざまなブラウザの固有の属性に基づくもので、もう 1 つはブラウザの userAgent 属性を分析することで判断されます。多くの場合、ブラウザの種類を値で決定した後、互換性の問題を処理するためにブラウザのバージョンを決定する必要があります。ブラウザのバージョンは、通常、ブラウザの userAgent を分析することによってのみ知ることができます。
まず、さまざまなブラウザとその userAgent の特性を分析しましょう。
IE
ActiveX コントロールの作成をサポートしているのは IE だけなので、他のブラウザにはない ActiveXObject 関数があります。 window オブジェクトに ActiveXObject 関数が存在することが確認できれば、現在のブラウザが IE であることが明確に判断できます。 IE の各バージョンの一般的な userAgent は次のとおりです:

コードをコピー コードは次のとおりです:

Mozilla/4.0 (互換性、MSIE 8.0、Windows NT 6.0)
Mozilla/4.0 (互換性、MSIE 7.0、Windows NT 5.2)
Mozilla/4.0 (互換性、MSIE 6.0、Windows NT 5.1)
Mozilla/4.0 (互換性、MSIE 5.0、Windows NT)

このうちバージョン番号はMSIEに続く番号となります。
Firefox
Firefox の各 DOM 要素には getBoxObjectFor 関数があり、DOM 要素の位置とサイズを取得するために使用されます (IE の対応する関数は getBoundingClientRect 関数です)。これを判断することで、現在のブラウザが Firefox であることがわかります。 Firefox のいくつかのバージョンの userAgent はおおよそ次のとおりです:
コードをコピー コードは次のとおりです:

Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12

このうちバージョン番号はFirefox以降の番号です。
オペラ
Opera は特別なブラウザ フラグ、つまり window.opera 属性を提供します。 Opera の典型的な userAgent は次のとおりです:
コードをコピー コードは次のとおりです:

Opera/9.27 (Windows NT 5.2; U; zh-cn)
Opera/8.0 (Macintosh; PPC Mac OS X; U; en)
Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0

その中でもバージョン番号は Opera に近い番号です。
サファリ
Safariブラウザには他のブラウザにはないopenDatabase機能があり、Safariを判断する目安となります。典型的な Safari userAgent は次のとおりです:
コードをコピー コードは次のとおりです:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML、Gecko など) バージョン/3.1 Safari/525.13
Mozilla/5.0 (iPhone; U; Mac OS X のような CPU) AppleWebKit/420.1 (KHTML、Gecko のような) バージョン/3.0 Mobile/4A93 Safari/419.3

バージョン番号は、Version の後の番号です。
クロム
Chrome には MessageEvent 機能がありますが、Firefox にもあります。ただし、幸いなことに、Chrome には Firefox の getBoxObjectFor 関数がありません。この条件に従って、Chrome ブラウザを正確に判断できます。現在、Chrome の userAgent は次のとおりです:
Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML、Gecko など) Chrome/0.2.149.27 Safari/525.13
このうち、Chromeのバージョン番号はその後の数字のみです。
興味深いことに、Chrome の userAgent には Safari 機能も含まれており、おそらくこれがすべての Apple ブラウザ アプリケーションを Chrome で実行するための基盤となっています。
上記の情報を理解していれば、これらの特性に基づいてブラウザの種類とバージョンを判断できます。判定結果はSys名前空間に保存され、今後のプログラムが読み込むフロントエンドフレームワークの基本フラグ情報となります。ブラウザーが決定されると、Sys 名前空間にはブラウザーの名前を含む属性が含まれ、その値はブラウザーのバージョン番号になります。たとえば、IE 7.0 が決定された場合、Sys.ie の値は 7.0 になり、Firefox 3.0 が決定された場合、Sys.firefox の値は 3.0 になります。以下はブラウザを決定するコードです:
<script type="text/javascript"> 
var Sys = {}; 
var ua = navigator.userAgent.toLowerCase(); 
if (window.ActiveXObject) 
Sys.ie = ua.match(/msie ([\d.]+)/)[1] 
else if (document.getBoxObjectFor) 
Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1] 
else if (window.MessageEvent && !document.getBoxObjectFor) 
Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1] 
else if (window.opera) 
Sys.opera = ua.match(/opera.([\d.]+)/)[1] 
else if (window.openDatabase) 
Sys.safari = ua.match(/version\/([\d.]+)/)[1]; 
//以下进行测试 
if(Sys.ie) document.write('IE: '+Sys.ie); 
if(Sys.firefox) document.write('Firefox: '+Sys.firefox); 
if(Sys.chrome) document.write('Chrome: '+Sys.chrome); 
if(Sys.opera) document.write('Opera: '+Sys.opera); 
if(Sys.safari) document.write('Safari: '+Sys.safari); 
</script> 
ログイン後にコピー


IE のユーザー数が最も多いため、IE を最初に判断し、次に Firefox を置きました。ユーザー数の多い順にブラウザの種類を決定することで、判断の効率が向上し、無駄な労力を削減できます。 Chrome が 3 位にランクされているのは、Chrome がまもなく市場シェアで 3 番目のブラウザになると予測しているためです。このうち、ブラウザのバージョンを解析する際には、正規表現を利用してバージョン情報を抽出します。
JavaScript が得意な場合は、前の判定コードを次のように記述することもできます:

<script type="text/javascript"> 
var Sys = {}; 
var ua = navigator.userAgent.toLowerCase(); 
window.ActiveXObject &#63; Sys.ie = ua.match(/msie ([\d.]+)/)[1] : 
document.getBoxObjectFor &#63; Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1] : 
window.MessageEvent && !document.getBoxObjectFor &#63; Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1] : 
window.opera &#63; Sys.opera = ua.match(/opera.([\d.]+)/)[1] : 
window.openDatabase &#63; Sys.safari = ua.match(/version\/([\d.]+)/)[1] : 0; 
//以下进行测试 
if(Sys.ie) document.write('IE: '+Sys.ie); 
if(Sys.firefox) document.write('Firefox: '+Sys.firefox); 
if(Sys.chrome) document.write('Chrome: '+Sys.chrome); 
if(Sys.opera) document.write('Opera: '+Sys.opera); 
if(Sys.safari) document.write('Safari: '+Sys.safari); 
</script> 
ログイン後にコピー


これにより、JavaScript コードがより合理化されます。もちろん、効率を重視するか保守性を重視するかによって、可読性は若干悪くなります。
さまざまな特性を使用してブラウザを決定する方が、正規表現を使用して userAgent を分析するよりも高速ですが、これらの特性はブラウザのバージョンによって異なる場合があります。例えば、あるブラウザ独自の機能が市場で成功を収めた場合、他のブラウザも追随してその機能を追加し、ブラウザ独自の機能が消滅し、当社の判断が失敗する可能性があります。したがって、比較的安全なアプローチは、userAgent の特性を解析してブラウザの種類を判断することです。さらに、とにかく、バージョン情報を判断するには、ブラウザの userAgent を解析する必要もあります。
さまざまなブラウザの userAgent 情報を分析すると、さまざまなブラウザとそのバージョンを区別する正規表現を見つけるのは難しくありません。さらに、ブラウザの種類とバージョンの判断を完全に統合できます。したがって、次のコードを書くことができます:

<script type="text/javascript"> 
var Sys = {}; 
var ua = navigator.userAgent.toLowerCase(); 
var s; 
(s = ua.match(/msie ([\d.]+)/)) &#63; Sys.ie = s[1] : 
(s = ua.match(/firefox\/([\d.]+)/)) &#63; Sys.firefox = s[1] : 
(s = ua.match(/chrome\/([\d.]+)/)) &#63; Sys.chrome = s[1] : 
(s = ua.match(/opera.([\d.]+)/)) &#63; Sys.opera = s[1] : 
(s = ua.match(/version\/([\d.]+).*safari/)) &#63; Sys.safari = s[1] : 0; 
//以下进行测试 
if (Sys.ie) document.write('IE: ' + Sys.ie); 
if (Sys.firefox) document.write('Firefox: ' + Sys.firefox); 
if (Sys.chrome) document.write('Chrome: ' + Sys.chrome); 
if (Sys.opera) document.write('Opera: ' + Sys.opera); 
if (Sys.safari) document.write('Safari: ' + Sys.safari); 
</script> 
ログイン後にコピー


このうち「…?…:…」などの判定表現はコードを簡略化するために使用されています。判定条件は代入文であり、正規表現のマッチングを完了して結果をコピーするだけでなく、そのまま条件判定としても機能します。後続のバージョン情報は、以前の一致結果から抽出するだけで済みます。これは非常に効率的なコードです。
上記のコードはすべて、フロントエンド フレームワークを構築するために行われた事前調査であり、5 つの主要なブラウザでテストされています。今後は、特定のブラウザを判断するには if(Sys.ie) または if(Sys.firefox) を使用するだけで済み、if(Sys.ie == '8.0') または if(Sys.ie) を使用するだけで済みます。 firefox == '3.0') やその他の形式は、依然として非常にエレガントに表現できます。
フロントエンドフレームワークプロジェクトが始まりました、すべては過程と結果次第です...
原文: Li Zhan (leadzen) Ali Software 2008-9-6 杭州

誰もがもっと楽しめるように、Script House の編集者がいくつかの内容をまとめました:

<script language="JavaScript"> 
function getOs() 
{ 
  var OsObject = ""; 
  if(navigator.userAgent.indexOf("MSIE")>0) { 
    return "MSIE"; //ie浏览器
  } 
  if(isChrome=navigator.userAgent.indexOf("Chrome")>0){ 
    return "chrome"; //Chrome浏览器
  } 
  if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){ 
    return "Firefox"; //Firefox浏览器
  } 
  if(isOpera=navigator.userAgent.indexOf("Opera")>0) { 
    return "Opera"; //Opera浏览器
  } 
  if(isSafari=navigator.userAgent.indexOf("Safari")>0) { 
    return "Safari"; //Safari浏览器
  }  
  if(isCamino=navigator.userAgent.indexOf("Camino")>0){ 
    return "Camino"; //Camino浏览器
//……增加一些其它代码……
  } 
  if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){ 
    return "Gecko"; 
  } 
} 
alert(navigator.userAgent);
 alert("您的浏览器类型为:"+getOs()); 
</script>
ログイン後にコピー

比較的完全な判定コード

<script type="text/javascript"> 
document.write('浏览器判別:');
var OsObject=navigator.userAgent;
// 包含「Opera」文字列 
if(OsObject.indexOf("Opera") != -1) 
{ 
   document.write('您的浏览器是Opera吧?'); 
} 
// 包含「MSIE」文字列 
else if(OsObject.indexOf("MSIE") != -1) 
{ 
   document.write('您的浏览器是Internet Explorer吧?'); 
} 
// 包含「chrome」文字列 ,不过360浏览器也照抄chrome的UA

else if(OsObject.indexOf("Chrome") != -1) 
{ 
  document.write('您的浏览器是chrome或360浏览器吧?'); 
}
// 包含「UCBrowser」文字列 
else if(OsObject.indexOf("UCBrowser") != -1) 
{ 
  document.write('您的浏览器是UCBrowser吧?'); 
}
// 包含「BIDUBrowser」文字列 
else if(OsObject.indexOf("BIDUBrowser") != -1) 
{ 
  document.write('您的浏览器是百度浏览器吧?'); 
}
// 包含「Firefox」文字列 
else if(OsObject.indexOf("Firefox") != -1) 
{ 
  document.write('您的浏览器是Firefox吧?'); 
}
// 包含「Netscape」文字列 
else if(OsObject.indexOf("Netscape") != -1)
{ 
  document.write('您的浏览器是Netscape吧?'); 
} 
// 包含「Safari」文字列 
else if(OsObject.indexOf("Safari") != -1) 
{ 
   document.write('您的浏览器是Safari 吧?'); 
} 
else{ 
  document.write('无法识别的浏览器。'); 
} 
</script> 
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート