摘要:客戶端檢測方式能力檢測怪癖檢測用戶代理檢測能力檢測最常用也是最為人們廣泛接受的客戶端檢測形式是能力檢測又稱特性檢測。在可能的情況下,盡量使用進行能力檢測。
客戶端檢測方式
能力檢測
怪癖檢測
用戶代理檢測
能力檢測
最常用也是最為人們廣泛接受的客戶端檢測形式是能力檢測(又稱特性檢測)。能力檢測的目標不是識別特定的瀏覽器,而是識別瀏覽器的能力。采用這種方式不必顧及特定的瀏覽器如何如何,只要確定瀏覽器支持特定的能力,就可以給出解決方案。能力檢測的基本模式如下:
if(object.propertyInQuestion){ // 使用object.propertyInQuestion }
要理解能力檢測,首先必須理解兩個重要的概念。
先檢測達成目的的最常用的特性
必須測試實際要用到的特性,一個特性存在,不一定意味著另一個特性也存在
更可靠的能力檢測
通過 typeof 確定是否為函數(shù),進行能力檢測。
// 檢查sort是不是函數(shù) function isSortable(object){ return typeof object.sort == "function"; }
typeof 操作符用于確定 sort 的卻是函數(shù),因此可以調(diào)用他對數(shù)據(jù)進行排序。
在可能的情況下,盡量使用 typeof 進行能力檢測。特別是宿主對象沒有義務讓 typeof 返回合理值。
能力檢測,不是瀏覽器檢測
檢測某個或某幾個特性并不能夠確定瀏覽器。實際上,根據(jù)瀏覽器不同將能力組合起來是更可取的方式,最好是一次性檢測所有相關(guān)特性,而不要分別檢測。
// 確定瀏覽器是否支持Netspace風格的插件 var hasNSPlugins = !!(navigator.plugins && navigator.pligins.length); // 確定瀏覽器是否具有DOM1級別規(guī)定的能力 var hasDOM1 = !!(document.getElementById && document.createElement && document.getElementByTagName);
得到的布爾值可以在后繼續(xù)使用,從而節(jié)省重新檢測能力的時間。
怪癖檢測與能力檢測類似,怪癖檢測的目標是識別瀏覽器的特殊行為。但與能力檢測確認瀏覽器支持什么能力不同,怪癖檢測是想要知道瀏覽器存在什么缺陷("怪癖" 也就是 bug)。這通常需要運行一小段代碼,以確定某一特性不能正常工作。
例如,IE8及更早版本中存在一個bug,即如果某個實例屬性與[[Enumerable]]標記為 false 的某個原型屬性同名,那么該實例屬性將不會出現(xiàn)在 for-in 循環(huán)當中。
var hasDontEnumQuik = function(){ var o = {toString : function(){}}; for(var props in o){ if (props == "toString"){ return false ; } } return true; }();
一般來說,“怪癖”都是個別瀏覽器所獨有的,而且通常被歸為 bug。在相關(guān)瀏覽器的新版本中,這些問題可能會也可能不會被修復。由于檢測 “怪癖” 設(shè)計運行代碼,因此我們建議僅檢測那些對你有直接影響的 “怪癖”,而且最好在腳本一開始就執(zhí)行此類檢測,以便盡早解決問題。
用戶代理檢測用戶代理檢測通過檢測用戶代理字符串來確定實際使用的瀏覽器。在每一次 HTTP 請求過程中,用戶代理字符串是作為響應首部發(fā)送的,而且該字符串可以通過 JavaScript 的 navigator.userAgent 屬性訪問。在服務器端,通過檢測用戶代理字符串來確定用戶使用的瀏覽器是一種常用而且廣為接受的做法。而在客戶端,用戶代理檢測一般被當做一種萬不得已才用的做法,其優(yōu)先級排在能力檢測和(或)怪癖檢測之后。
以下是完整的用戶代理字符串檢測腳本,包括檢測呈現(xiàn)引擎、平臺、window操作系統(tǒng)、移動設(shè)備和游戲系統(tǒng)。
var client = function(){ // rendering engines var engine = { ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 0, // complete version ver: null }; // browsers var browser = { // browsers ie: 0, firefox: 0, safari: 0, konq: 0, opera: 0, chrome: 0, // specific version ver: null }; // platform/device/OS var system = { win: false, mac: false, x11: false, // mobile devices iphone: false, ipod: false, ipad: false, ios: false, android: false, nokiaN: false, winMobile: false, // game systems wii: false, ps: false }; // detect rendering engines/browsers 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); // figure out if it"s Chrome or 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 { // approximate version 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); // determine if it"s 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); } // detect browsers browser.ie = engine.ie; browser.opera = engine.opera; // detect platform var p = navigator.platform; system.win = p.indexOf("Win") == 0; system.mac = p.indexOf("Mac") == 0; system.x11 = (p == "X11") || (p.indexOf("Linux") == 0); // detect windows operating systems 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"]; } } } // mobile devices 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"]); } } // determine iOS version 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; // can"t really detect - so guess } } // determine Android version if (/Android (d+.d+)/.test(ua)){ system.android = parseFloat(RegExp.$1); } // gaming systems system.wii = ua.indexOf("Wii") > -1; system.ps = /playstation/i.test(ua); // return it return { engine: engine, browser: browser, system: system }; }();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103093.html
摘要:與執(zhí)行環(huán)境相關(guān)的變量對象中有執(zhí)行環(huán)境定義的所有變量和函數(shù)作用域鏈代碼在一個環(huán)境中執(zhí)行,便會創(chuàng)建變量對象的一個作用域鏈。 執(zhí)行環(huán)境 執(zhí)行環(huán)境是什么? javascript的解釋器每次開始執(zhí)行一個函數(shù)時,都會為每個函數(shù)創(chuàng)建一個執(zhí)行環(huán)境(execution context)。 執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了他們各自的行為。 與執(zhí)行環(huán)境相關(guān)的變量對象(...
摘要:大小寫的不同分別表示不同的變量。本質(zhì)由一組無序的名值對組成的。字符串中第一個小數(shù)點有效,第二個無效,后面的字符串會被忽略。注意雙引號開頭,必須以雙引號結(jié)尾,單引號也是如此轉(zhuǎn)義字符表示非打印字符或具有其他用途的字符。 JavaScript高級程序設(shè)計(第3版)讀書筆記 1.區(qū)分大小寫: 變量、函數(shù)名和操作符都要區(qū)分大小寫。大小寫的不同分別表示不同的變量。 2.標識符: 變量、函數(shù)、屬性...
摘要:對象的核心對象是,它表示瀏覽器的一個實例。而和則表示該容器中頁面視圖區(qū)的大小。在中,與返回相同的值,即視口大小而非瀏覽器窗口大小。第三個參數(shù)是一個逗號分隔的設(shè)置字符串,表示在新窗口中都顯示哪些特性。這應該是用戶打開窗口后的第一個頁面 BOM window對象 BOM的核心對象是window,它表示瀏覽器的一個實例。在瀏覽器中,window對象有雙重角色,它既是通過JavaScript訪...
摘要:類型的錯誤會在數(shù)值超出相應范圍時觸發(fā)。最常發(fā)生類型錯誤的情況,就是傳遞給函數(shù)的參數(shù)事先未經(jīng)檢查,結(jié)果傳入類型與預期類型不相符。捕獲錯誤的目的在于避免瀏覽器以默認方式處理它們而拋出錯誤的目的在于提供錯誤發(fā)生具體原因的消息。 0 前言 目前讀到了《高程3》的錯誤檢測部分,現(xiàn)在先挖一個坑,關(guān)于錯誤檢測應該寫三篇總結(jié):firebug檢測錯誤和輸出信息;try-catch錯誤捕獲;常見錯誤種類。...
摘要:類型的錯誤會在數(shù)值超出相應范圍時觸發(fā)。最常發(fā)生類型錯誤的情況,就是傳遞給函數(shù)的參數(shù)事先未經(jīng)檢查,結(jié)果傳入類型與預期類型不相符。捕獲錯誤的目的在于避免瀏覽器以默認方式處理它們而拋出錯誤的目的在于提供錯誤發(fā)生具體原因的消息。 0 前言 目前讀到了《高程3》的錯誤檢測部分,現(xiàn)在先挖一個坑,關(guān)于錯誤檢測應該寫三篇總結(jié):firebug檢測錯誤和輸出信息;try-catch錯誤捕獲;常見錯誤種類。...
閱讀 1104·2021-09-22 15:37
閱讀 1131·2021-09-13 10:27
閱讀 2466·2021-08-25 09:38
閱讀 2445·2019-08-26 11:42
閱讀 1524·2019-08-26 11:39
閱讀 1554·2019-08-26 10:58
閱讀 2317·2019-08-26 10:56
閱讀 2569·2019-08-23 18:08