成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《JavaScript高級程序設(shè)計》筆記:客戶端檢測(九)

aaron / 1057人閱讀

摘要:由于怪癖檢測無法精確地檢測特定的瀏覽器和版本。用戶代理檢測需要特殊的技巧,特別是要注意會隱瞞其用戶代理字符串的情況。而在客戶端,用戶代理檢測一般被當(dāng)作一種萬不得已的做法,其優(yōu)先級排在能力檢測和怪癖檢測之后。

能力檢測

在編寫代碼之前先檢測特定瀏覽器的能力。例如,腳本在調(diào)用某個函數(shù)之前,可能要先檢測該函數(shù)首付存在。這種檢測方法將開發(fā)人員從考慮具體的瀏覽器類型和版本中解放出來,讓他們把注意力集中到相應(yīng)的能力是否存在上。能力檢測無法精確地檢測特定的瀏覽器和版本。

怪癖檢測

怪癖實際上是瀏覽器實現(xiàn)中存在的bug,例如早期的webkit中就存在一個怪癖,即它會再for-in循環(huán)中返回被隱藏的屬性。怪癖檢測通常涉及到運行一段代碼,然后確定瀏覽器是否存在某個怪癖。由于怪癖檢測無法精確地檢測特定的瀏覽器和版本。

用戶代理檢測

通過檢測用戶代理字符串來識別瀏覽器。用戶代理字符串中包含大量與瀏覽器有關(guān)的信息,包括瀏覽器、平臺、操作系統(tǒng)及瀏覽器版本。用戶代理字符串有過一段相當(dāng)長的發(fā)展歷史,在此期間,瀏覽器提供商視圖通過在用戶代理字符串總添加一些欺騙性信息,欺騙網(wǎng)站詳細(xì)自己的瀏覽器是另外一種瀏覽器。用戶代理檢測需要特殊的技巧,特別是要注意Opera會隱瞞其用戶代理字符串的情況。即便如此,通過用戶代理字符串仍然能夠檢測出瀏覽器所用的呈現(xiàn)引擎以及所在的平臺,包括移動設(shè)備和游戲系統(tǒng)。

在每一次HTTP請求過程中,用戶代理字符串是作為響應(yīng)首部發(fā)送的,而且該字符串可以通過Javascript的navigator.userAgent屬性訪問。在服務(wù)器端,通過檢測用戶代理字符串來確定用戶使用的瀏覽器是一種常用而且廣為接受的做法。而在客戶端,用戶代理檢測一般被當(dāng)作一種萬不得已的做法,其優(yōu)先級排在能力檢測和怪癖檢測之后。

var client = function(){
    // 呈現(xiàn)引擎
    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
    };

    // 檢測呈現(xiàn)引擎和瀏覽器
    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);

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85403.html

相關(guān)文章

  • ApacheCN 人工智能知識樹 v1.0

    摘要:貢獻(xiàn)者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...

    劉厚水 評論0 收藏0
  • JavaScript高級程序設(shè)計筆記:BOM(八)

    摘要:瀏覽器對象模型提供了很多對象,用于訪問瀏覽器的功能,這些功能與任何網(wǎng)頁內(nèi)容無關(guān)。對象基本上只用來表明客戶端的能力。 BOM(瀏覽器對象模型)提供了很多對象,用于訪問瀏覽器的功能,這些功能與任何網(wǎng)頁內(nèi)容無關(guān)。 window對象 全局作用域 定義全局變量與在window對象上直接定義屬性還是有一點差別:全局變量不能通過delete操作符刪除,而直接在window對象上的定義的屬性可以。 v...

    mushang 評論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.30 - 學(xué)習(xí) Python 來做一些神奇好玩的事情吧

    摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...

    lifesimple 評論0 收藏0
  • javascript高級程序設(shè)計筆記檢測數(shù)組的方法

    摘要:如果網(wǎng)頁中包含多個框架,那實際上就存在兩個以上不同的全局執(zhí)行環(huán)境,從而存在兩個以上不同版本的構(gòu)造函數(shù)。如果你從一個框架向另一個框架傳入一個數(shù)組,那么傳入的數(shù)組與在第二個框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。 如何檢測某個變量是否為數(shù)組? 《javascript 高級程序設(shè)計》原文摘錄: 自從 ECMAScript 3 做出規(guī)定以后,就出現(xiàn)了確定某個對象是不是數(shù)組的經(jīng)典問題...

    wums 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<