ブラウザ判別関数の続き
WebKitnの判別
SafariとChromeについてはWebKitのバージョン番号をself.navigator.userAgentから抽出して判別する(AppleWebKit/XXXのXXXの部分)。
Chrome 1.0は2008-12-12、Safari 3.0.4が2007-10-26なので、Safari 3.0.4のWebKitバージョン以降であれば2、それ以外は1とすればOK。
Safari 3.0.4のWebKitバージョンは523.15らしいので、これを基準に。また、手元のSafari 4.0.5のWebKitバージョンは531.22.7だったので、数値比較をするために、二個目以降の小数点以降は無視するように。
Geckoの判別
FirefoxについてはGeckoのバージョン日付(?)をself.navigator.productSubから取得して判別する。
Firefox 1.5の最終バージョンである1.5.0.12のproductSubは"20070508"だったので、これ以下なら1、そうでなければ2とする。
まとめ
以上を素直にコードに起こすとこんな感じになった。
function checkGrade() { /*@cc_on if (@_win16 || @_win32 || @_win64) { var v = @_jscript_version; if (v > 5.5) return 2; if (v >= 5.0) return 1; } return 0; @*/ function isObject(x) { return typeof(x) == 'object' && x != null; } function isFunction(x) { return typeof(x) == 'function' && x.constructor == Function; } if (!isFunction(window.addEventListener)) { return 0; } if (isObject(window.opera) && isFunction(window.opera.version)) { return window.opera.version() >= 9.25 ? 2 : 1; } var result = /AppleWebKit\/(\d+\.\d+)/.exec(self.navigator.userAgent); if (result) { result = parseFloat(result[1]); return isFinite(result) && result >= 523.15 ? 2 : 1; } if (self.navigator.userAgent.indexOf('Gecko') >= 0) { result = parseInt(self.navigator.productSub, 10); return isFinite(result) && result > 20070508 ? 2 : 1; } return 1; }