摘要:檢測(cè)腳本的基本代碼結(jié)構(gòu)如下所示呈現(xiàn)引擎具體的版本號(hào)檢測(cè)呈現(xiàn)引擎全局變量,用于保存相關(guān)信息。如果檢測(cè)到了哪個(gè)呈現(xiàn)引擎,那么就以浮點(diǎn)數(shù)值形式將該引擎的版本號(hào)寫(xiě)入相應(yīng)的屬性。
前言
前端這東西,各種先有事實(shí)后有標(biāo)準(zhǔn)。不管是各大瀏覽器老哥各自為政,還是w3c姍姍來(lái)遲,既有事實(shí)標(biāo)準(zhǔn)難以更改。雖說(shuō)多方割據(jù),互相競(jìng)爭(zhēng),總比一家獨(dú)大,愛(ài)更不更來(lái)得好。但卻苦了我們這些平頭小碼農(nóng)?,頸椎病又加深了啊。
之前閱讀了《JavaScript高級(jí)程序設(shè)計(jì)》,今日準(zhǔn)備將其用戶代理檢測(cè)源碼部分做個(gè)歸納。
槽不多吐,開(kāi)始正文!
博文地址:客戶端檢測(cè)之用戶代理檢測(cè) — navigator.userAgent
面對(duì)各瀏覽器普遍存在的不一致性問(wèn)題,開(kāi)發(fā)人員就得利用各種客戶端檢測(cè)方法,來(lái)突破或規(guī)避各種局限性。
檢測(cè)Web客戶端的手段很多,各有利弊。在服務(wù)器端,用戶代理檢測(cè)是一種常用且廣為接收的做法。通過(guò)對(duì)瀏覽器發(fā)送的用戶代理字符串的內(nèi)容進(jìn)行檢測(cè),來(lái)識(shí)別用戶的瀏覽器。
BOM,即瀏覽器對(duì)象模型。BOM提供了很多對(duì)象,用于訪問(wèn)瀏覽器的功能,且這些功能與網(wǎng)內(nèi)內(nèi)容無(wú)關(guān)。其主要方面已被w3c加入HTML5豪華套餐。
BOM包含window、location、navigator、screen、history對(duì)象,navigator對(duì)象中的userAgent屬性便是用戶代理字符串。
var ua = navigator.userAgent;//用戶代理字符串3.1 呈現(xiàn)引擎檢測(cè)
主要檢測(cè)五大呈現(xiàn)引擎(渲染引擎):IE、Gecko、WebKit、KHTML 和 Opera。
為了不在全局作用域中添加多余的變量,使用模塊增強(qiáng)模式來(lái)封裝檢測(cè)腳本。檢測(cè)腳本的基本代碼結(jié)構(gòu)如下所示:
var client = function () { var engine = { //呈現(xiàn)引擎 ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 0, //具體的版本號(hào) ver: null }; //檢測(cè)呈現(xiàn)引擎 return { engine: engine }; }();
client全局變量,用于保存相關(guān)信息。匿名函數(shù)內(nèi)部定義了一個(gè)局部變量engine,每個(gè)呈現(xiàn)引擎都對(duì)應(yīng)著一個(gè)屬性,屬性的值默認(rèn)為0。如果檢測(cè)到了哪個(gè)呈現(xiàn)引擎,那么就以浮點(diǎn)數(shù)值形式將該引擎的版本號(hào)寫(xiě)入相應(yīng)的屬性。而呈現(xiàn)引擎的完整版本(是一個(gè)字符串),則寫(xiě)入ver屬性。
//檢測(cè)呈現(xiàn)引擎 var ua = navigator.userAgent; if (window.opera) { engine.ver = window.opera.version(); engine.opera = parseFloat(engine.ver); } else if (/AppleWebKit/(S+)/.test(ua)) { engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); } else if (/KHTML/(S+)/.test(ua)) { engine.ver = RegExp["$1"]; engine.khtml = parseFloat(engine.ver); } else if (/rv:([^)]+)) Gecko/d{8}/.test(ua)) { engine.ver = RegExp["$1"]; engine.gecko = parseFloat(engine.ver); } else if (/MSIE ([^;]+)/.test(ua)) { engine.ver = RegExp["$1"]; engine.ie = parseFloat(engine.ver); }3.2 識(shí)別瀏覽器
var client = function(){ var engine = { //呈現(xiàn)引擎 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 }; //檢測(cè)呈現(xiàn)引擎和瀏覽器 return { engine: engine, browser: browser }; }();
代碼中又添加了私有變量browser ,用于保存每個(gè)主要瀏覽器的屬性。與engine變量一樣,除了當(dāng)前使用的瀏覽器,其他屬性的值將保持為0;如果是當(dāng)前使用的瀏覽器,則這個(gè)屬性中保存的是浮點(diǎn)數(shù)值形式的版本號(hào)。同樣,ver屬性中在必要時(shí)將會(huì)包含字符串形式的瀏覽器完整版本號(hào)。
由于大多數(shù)瀏覽器與其呈現(xiàn)引擎密切相關(guān),所以下面示例中檢測(cè)瀏覽器的代碼與檢測(cè)呈現(xiàn)引擎的代碼是混合在一起的。
//檢測(cè)呈現(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(browser.ver); } else if (/Version/(S+)/.test(ua)) { browser.ver = RegExp["$1"]; browser.safari = parseFloat(browser.ver); } else { // 近似地確定版本號(hào) 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.konq = 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); }3.3 識(shí)別系統(tǒng)平臺(tái)
很多時(shí)候,只要知道呈現(xiàn)引擎就足以編寫(xiě)出適當(dāng)?shù)拇a了。但在某些條件下,平臺(tái)可能是必須關(guān)注的問(wèn)題。那些具有各種平臺(tái)版本的瀏覽器(如 Safari、Firefox 和 Opera),在不同的平臺(tái)下可能會(huì)有不同的問(wèn)題。目前的三大主流平臺(tái)是 Windows、Mac 和 Unix(包括各種 Linux)。
再添加一個(gè)新對(duì)象:
var client = function () { var system = { win: false, mac: false, x11: false }; //檢測(cè)設(shè)備 var p = navigator.platform; system.win = p.indexOf("Win") == 0; system.mac = p.indexOf("Mac") == 0; system.x11 = (p.indexOf("X11") == 0) || (p.indexOf("Linux" == 0); return { engine: engine, browser: browser, system: system }; }();3.3.1 識(shí)別具體Windows系統(tǒng)
在Windows平臺(tái)下,還可以從用戶代理字符串中進(jìn)一步取得具體的操作系統(tǒng)信息。下表列出了不同瀏覽器在表示不同的Windows操作系統(tǒng)時(shí)給出的不同字符串:
由于用戶代理字符串中的Windows操作系統(tǒng)版本表示方法各異,因此檢測(cè)代碼并不十分直觀。好在,從 Windows 2000 開(kāi)始,表示操作系統(tǒng)的字符串大部分都還相同,只有版本號(hào)有變化。為了檢測(cè)不同的Windows操作系統(tǒng),必須要使用正則表達(dá)式。由于使用 Opera 7 之前版本的用戶已經(jīng)不多了,因此我們可以忽略這部分瀏覽器。
if (system.win) { if (/Win(?:dows )?([^do]{2})s?(d+.d+)?/.test(ua)) { if (RegExp["$1"] == "NT") { switch (RegExp["$2"]) { case "5.0": system.win = "2000"; break; case "5.1": system.win = "XP"; break; case "6.0": system.win = "Vista"; break; case "6.1": system.win = "7"; break; default: system.win = "NT"; break; } } else if (RegExp["$1"] == "9x") { system.win = "ME"; } else { system.win = RegExp["$1"]; } } }3.3.2 識(shí)別移動(dòng)設(shè)備
var client = function () { var system = { win: false, mac: false, x11: false, // 移動(dòng)設(shè)備 iphone: false, ipod: false, ipad: false, ios: false, android: false, nokiaN: false, winMobile: false }; //檢測(cè)移動(dòng)設(shè)備 system.iphone = ua.indexOf("iPhone") > -1; system.ipod = ua.indexOf("iPod") > -1; system.ipad = ua.indexOf("iPad") > -1; system.nokiaN = ua.indexOf("NokiaN") > -1; //windows mobile if (system.win == "CE") { system.winMobile = system.win; } else if (system.win == "Ph") { if (/Windows Phone OS (d+.d+)/.test(ua)) { system.win = "Phone"; system.winMobile = parseFloat(RegExp["$1"]); } } //檢測(cè) iOS 版本 if (system.mac && ua.indexOf("Mobile") > -1) { if (/CPU (?:iPhone )?OS (d+_d+)/.test(ua)) { system.ios = parseFloat(RegExp.$1.replace("_", ".")); } else { system.ios = 2; //不能真正檢測(cè)出來(lái),所以只能猜測(cè) } } //檢測(cè) Android 版本 if (/Android (d+.d+)/.test(ua)) { system.android = parseFloat(RegExp.$1); } return { engine: engine, browser: browser, system: system }; }();3.3.3 識(shí)別游戲系統(tǒng)
除了移動(dòng)設(shè)備之外,視頻游戲系統(tǒng)中的 Web 瀏覽器也開(kāi)始日益普及。任天堂 Wii和Playstation 3 或者內(nèi)置 Web 瀏覽器,或者提供了瀏覽器下載。Wii 中的瀏覽器實(shí)際上是定制版的 Opera,是專(zhuān)門(mén)為 Wii Remote 設(shè)計(jì)的。Playstation 的瀏覽器是自己開(kāi)發(fā)的,沒(méi)有基于前面提到的任何呈現(xiàn)引擎。這兩個(gè)瀏覽器中的用戶代理字符串如下所示:
Opera/9.10 (Nintendo Wii;U; ; 1621; en) Mozilla/5.0 (PLAYSTATION 3; 2.00)
第一個(gè)字符串來(lái)自運(yùn)行在 Wii 中的 Opera,它忠實(shí)地繼承了 Opera 最初的用戶代理字符串格式。第二個(gè)字符串來(lái)自 Playstation 3,雖然它為了兼容性而將自己標(biāo)識(shí)為 Mozilla 5.0,但并沒(méi)有給出太多信息,而且設(shè)備名稱(chēng)全部使用了大寫(xiě)字母。
var client = function () { var system = { win: false, mac: false, x11: false, // 移動(dòng)設(shè)備 iphone: false, ipod: false, ipad: false, ios: false, android: false, nokiaN: false, winMobile: false, // 游戲系統(tǒng) wii: false, ps: false }; //檢測(cè)游戲系統(tǒng) system.wii = ua.indexOf("Wii") > -1; system.ps = /playstation/i.test(ua); return { engine: engine, browser: browser, system: system }; }();3.4 完整代碼
UserAgentDetection.js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88848.html
摘要:檢測(cè)腳本的基本代碼結(jié)構(gòu)如下所示呈現(xiàn)引擎具體的版本號(hào)檢測(cè)呈現(xiàn)引擎全局變量,用于保存相關(guān)信息。如果檢測(cè)到了哪個(gè)呈現(xiàn)引擎,那么就以浮點(diǎn)數(shù)值形式將該引擎的版本號(hào)寫(xiě)入相應(yīng)的屬性。 前言 前端這東西,各種先有事實(shí)后有標(biāo)準(zhǔn)。不管是各大瀏覽器老哥各自為政,還是w3c姍姍來(lái)遲,既有事實(shí)標(biāo)準(zhǔn)難以更改。雖說(shuō)多方割據(jù),互相競(jìng)爭(zhēng),總比一家獨(dú)大,愛(ài)更不更來(lái)得好。但卻苦了我們這些平頭小碼農(nóng)?,頸椎病又加深了啊。 ...
摘要:用戶代理檢測(cè)通過(guò)的屬性訪問(wèn)。在服務(wù)器端,通過(guò)檢測(cè)用戶代理字符串來(lái)確定用戶使用的瀏覽器是一種常用的做法但在客戶端,用戶代理檢測(cè)一般為最低優(yōu)先級(jí)。目前只要檢測(cè)五大呈現(xiàn)引擎即可和。 用戶代理檢測(cè) 通過(guò) JavaScript 的 navigator.userAgent 屬性訪問(wèn)。在服務(wù)器端,通過(guò)檢測(cè)用戶代理字符串來(lái)確定用戶使用的瀏覽器是一種常用的做法;但在客戶端,用戶代理檢測(cè)一般為最低優(yōu)先級(jí)。...
摘要:由于怪癖檢測(cè)無(wú)法精確地檢測(cè)特定的瀏覽器和版本。用戶代理檢測(cè)需要特殊的技巧,特別是要注意會(huì)隱瞞其用戶代理字符串的情況。而在客戶端,用戶代理檢測(cè)一般被當(dāng)作一種萬(wàn)不得已的做法,其優(yōu)先級(jí)排在能力檢測(cè)和怪癖檢測(cè)之后。 能力檢測(cè) 在編寫(xiě)代碼之前先檢測(cè)特定瀏覽器的能力。例如,腳本在調(diào)用某個(gè)函數(shù)之前,可能要先檢測(cè)該函數(shù)首付存在。這種檢測(cè)方法將開(kāi)發(fā)人員從考慮具體的瀏覽器類(lèi)型和版本中解放出來(lái),讓他們把注意...
摘要:用戶代理檢測(cè)用戶代理檢測(cè)是爭(zhēng)議最大的客戶端檢測(cè)技術(shù)。第二個(gè)要檢測(cè)是。由于實(shí)際的版本號(hào)可能會(huì)包含數(shù)字小數(shù)點(diǎn)和字母,所以捕獲組中使用了表示非空格的特殊字符。版本號(hào)不在后面,而是在后面。除了知道設(shè)備,最好還能知道的版本號(hào)。 檢測(cè)Web客戶端的手段很多,各有利弊,但不到萬(wàn)不得已就不要使用客戶端檢測(cè)。只要能找到更通用的方法,就應(yīng)該優(yōu)先采用更通用的方法。一言蔽之,先設(shè)計(jì)最通用的方案,然后再使用特定...
摘要:客戶端檢測(cè)方式能力檢測(cè)怪癖檢測(cè)用戶代理檢測(cè)能力檢測(cè)最常用也是最為人們廣泛接受的客戶端檢測(cè)形式是能力檢測(cè)又稱(chēng)特性檢測(cè)。在可能的情況下,盡量使用進(jìn)行能力檢測(cè)。 客戶端檢測(cè)方式 能力檢測(cè) 怪癖檢測(cè) 用戶代理檢測(cè) 能力檢測(cè) 最常用也是最為人們廣泛接受的客戶端檢測(cè)形式是能力檢測(cè)(又稱(chēng)特性檢測(cè))。能力檢測(cè)的目標(biāo)不是識(shí)別特定的瀏覽器,而是識(shí)別瀏覽器的能力。采用這種方式不必顧及特定的瀏覽器如何...
閱讀 821·2023-04-25 19:49
閱讀 3756·2021-09-30 09:47
閱讀 2742·2021-09-13 10:21
閱讀 2680·2021-08-24 10:04
閱讀 3168·2019-08-30 15:55
閱讀 2296·2019-08-30 15:55
閱讀 2399·2019-08-30 15:54
閱讀 3471·2019-08-30 13:53