「JavaScript高級プログラム設計」ノート:クライアント検出(9)


能力テスト
コードを作成する前に、特定のブラウザの能力を検出します.例えば、スクリプトは、ある関数を呼び出す前に、先に関数のヘッダが存在することを検出します.この検出方法は、開発者が具体的なブラウザのタイプとバージョンを考慮して解放され、対応する能力が存在するかどうかに焦点を当てる.能力検出では、特定のブラウザとバージョンを正確に検出できませんでした.
癖検出
奇癖は実際にブラウザの実現に存在するバグで、例えば初期のwebkitにはもう一つの癖があります.つまり、for-i-nサイクル中に隠し属性に戻ります.癖検出は通常、コードの一部を実行し、ブラウザに癖があるかどうかを確認します.癖検出で特定のブラウザとバージョンを正確に検出できませんでした.
ユーザエージェント検出
ユーザエージェント文字列を検出することにより、ブラウザを識別する.ユーザエージェント文字列には、ブラウザ、プラットフォーム、オペレーティングシステム、ブラウザバージョンなど、ブラウザに関する多くの情報が含まれています.ユーザーエージェント文字列はかなり長い発展の歴史があります.この期間に、ブラウザプロバイダビューはユーザーエージェント文字列に合計いくつかの不正情報を追加することによって、ウェブサイトの詳細を欺くブラウザは別のブラウザです.ユーザエージェントの検出には特別なテクニックが必要であり、特にOperaがユーザエージェント文字列の状況を隠すことに注意する.それでも、ユーザエージェント文字列によって、ブラウザで使用されるレンダリングエンジンと、モバイルデバイスおよびゲームシステムを含む既存のプラットフォームが検出される.
毎回HTTP要求中に、ユーザエージェント文字列は応答ヘッダとして送信され、この文字列はJavascriptのnavigator.userAgent属性を介してアクセスすることができる.サーバ端では、ユーザエージェント文字列を検出することにより、ユーザが使用するブラウザを決定することが、一般的で広く受け入れられる方法である.クライアントでは、ユーザエージェント検出は、一般的に、能力検出および癖検出の後に優先順位を付けるやむを得ない方法として扱われる.
var client = function(){
    //     
    var engine = {
        ie:0,
        gecko:0,
        webkit:0,
        khtml:0,
        opera:0,

        //       
        ver:null
    };

    //    
    var browser = {
        //      
        ie:0,
        firefox:0,
        safari:0,
        konq:0,
        opera:0,
        chrome:0,

        //       
        ver:null
    };

    //           
    var ua = navigator.userAgent;
    if (window.opera) {
        engine.ver = browser.ver = window.opera.version();
        engine.opera = browser.opera = parseFloat(engine.ver);
    } else if (/AppleWebKit\/(\S+)/.test(ua)) {
        engine.ver = RegExp["$1"];
        engine.webkit = parseFloat(engine.ver);

        //    Chrome  Safari
        if (/Chrome\/(\S+)/.test(ua)) {
            browser.ver = RegExp["$1"];
            browser.chrome = parseFloat(engine.ver);
        } else if (/Version\/(S+)/.test(ua)) {
            browser.ver = RegExp["$1"];
            browser.safari = parseFloat(browser.ver);
        } else {

            //         
            var safariVersion = 1;
            if (engine.Webkit <100) {
                safariVersion = 1;
            } else if (engine.webkit < 312) {
                safariVersion = 1.2;
            } else if (engine.webkit < 412) {
                safariVersion = 1.3;
            } else {
                safariVersion = 2;
            }

            browser.safari = browser.ver = safariVersion;
        }
    } else if (/KHTML\/(S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
        engine.ver = browser.ver = RegExp["$1"];
        engine.khtml = browser.kong = parseFloat(engine.ver);
    } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){
        engine.ver = RegExp["$1"];
        engine.gecko = parseFloat(engine.ver);

        //      firefox
        if (/Firefox\/(S+)/.test(ua)) {
            browser.ver = RegExp["$1"];
            browser.firefox = parseFloat(browser.ver);
        }
    } else if (/MSIE ([^;]+)/.test(ua)) {
        engine.ver = browser.ver = RegExp["$1"];
        engine.ie = browser.ie = parseFloat(engine.ver);

    }

    //      
    browser.ie = engine.ie;
    browser.opera = engine.opera;

    //       
    return {
        engine:engine,
        browser: browser
    }
}();

console.log(client.engine);
console.log(client.browser);