ただやはり、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];
}
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日更新が無いと広告出るようになってる・・・
同日改変:少し堅くしました



この記事へのコメント