ブラウザ判別関数の続き

WebKitnの判別

SafariChromeについては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;
}