2009年12月15日

Javascript:ユーザーエージェントに頼るのは良くないけども

クロスブラウジングのために UA(user agent)判定するのは良くないけども、それでも UA による判定が必要な場合があるかも知れない。ということで何年もほったらかしていた UA 判定(バージョンもついでに取得)をようやく書き換えたので、こっちにもアップ。

ただやはり、Javascript のために UA 判定が要る場合って無い。CSS のためにわざわざ Javascript 書くのも安定感を損なうだけだし、そもそも UA なんてねぇ。

うーん。最近はサーバサイド(主に PHP)ばかりで、あまり楽しくない・・・。

■ ずっとよさげな記事があったのでリンク
(10/01/06)
Magicantさん
UAIdentifier - JavaScript によるユーザエージェント判別
http://homepage2.nifty.com/magicant/sjavascript/uai-spec.html
※ ざっと目を通しただけだけど良さそう。覚えも含めて。
(10/01/19)
tanablog さん
JavaScript ライブラリの、ブラウザ判定ロジックを調べてみた
http://blog.kaihatsubu.com/archives/001593.html
※ 自分としては、やはりUA判定より実装の方が好きだなぁ。

■ 確認環境
msie 7
firefox 3
opera 10
chrome 3
safari 4

その他、単純にユーザーエージェントの文字列によるテストはこちら
※ ブラウザーそのものによる判定ではなく、単純にユーザーエージェントの文字列を突っ込んでいる事に注意。

■ 確認できるブラウザ
msie, firefox, opera, chrome, safari, konqueror, lunascape, netscape, sleipnir
とその各バージョン(上記の文字列で返ってきます。)
ないだろそれ!ってヤツも居座っていますが、まぁ気にしない。ちなみに不明の場合は、空文字として扱えます。その他 gecko や mozilla とも返ってきますが、ほとんどの場合は不明と同じです。


 ソース


var ua = ua.toLowerCase();
var ver = '';
if(ua.match(/version\/([\.0-9]+)/) && RegExp.$1){
  ver = RegExp.$1;
}else if(ua.match(/applewebkit\/4([\.0-9]+)/) && RegExp.$1){
  ver = '2';
}else if(ua.match(/applewebkit\/([\.0-9]+)/) && RegExp.$1){
  ver = '1';
}
if(ua.match(/(opera|chrome|sleipnir|lunascape|netscape6)[\/\s]([\.0-9]+)/) && RegExp.$1){
  // camouflaged MSIE : Opera, Sleipnir, Lunascape
  // camouflaged Safari : chrome
}else if(ua.match(/(msie|firefox|konqueror|netscape|safari)[\/\s]([\.0-9]+)/) && RegExp.$1){
}else if(ua.match(/(gecko)/) && RegExp.$1){
  // Gecko Family : Netscape, FireFox
  // Like Gecko : Chrome, Safari(AppleWebKit), Shiira, Konqueror, NetFront
}else if(ua.match(/(mozilla)\/([\.0-9]+)/) && RegExp.$1){
  // absolutely 'unknown'
}else{
  // unknown
}
B_NAME = ('' + RegExp.$1);
A_VER = ('' + RegExp.$2);
if(B_NAME == 'safari' || (B_NAME == 'opera' && ver)){
  M_VER = ver;
}else if(B_NAME == 'firefox' && A_VER.search(1.5) == 0){
  M_VER = '1.5';
}else if(B_NAME == 'msie' && A_VER.search(5.5) == 0){
  M_VER = '5.5';
}else{
  M_VER = A_VER.split('.')[0];
}


関数化してないので、使う場合は必要に応じて関数化してください。
現状、global (相当)の変数 B_NAME にブラウザ名、M_VER にメジャーバージョン、A_VER にバージョンが返されます。メジャーバージョンは、本当の意味でのメジャーバージョンではない場合があります。どちらかと言えば、「良く知られた」バージョン(のつもり)にしてあります。

・ Opera 10
Opera/9.80 (Windows NT 5.1; U; ja) Presto/2.2.15Version/10.10
の場合 M_VER : 10, A_VER : 9.80

・ Firefox
Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
の場合 M_VER : 1.5, A_VER : 1.5.0.4
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.6) Gecko/2009011912 Firefox/3.0.6
の場合 M_VER : 3, A_VER : 3.0.6

・ MSIE
Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
の場合 M_VER : 5.5, A_VER : 5.5
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
の場合 M_VER : 6, A_VER : 6.0

になります。
初期の safari はややこしいです。詳しい結果はこちら
※ お遊びで意味のない物もあります。

うっ。seesaa 60日更新が無いと広告出るようになってる・・・
同日改変:少し堅くしました


posted by HiFa at 14:10 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする
>>> スパムコメントは消してますよん。 お互い無駄な労力は避けましょう。 <<<

この記事へのコメント

コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。