摘要:能力檢測(cè)性能檢測(cè)基本模式語(yǔ)法目標(biāo)不是識(shí)別特定的瀏覽器,而是識(shí)別瀏覽器的能力。更可靠的能力檢測(cè)能力檢測(cè)對(duì)于想知道某個(gè)特性是否會(huì)按照適當(dāng)方式行事非常有用。所以在可能的情況下,要盡量使用進(jìn)行能力檢測(cè)。
客戶端檢測(cè)
不到萬(wàn)不得已,就不要使用客戶端檢測(cè)。只要能夠找到更通用的方法,就應(yīng)該優(yōu)先采用更通用的方法。先設(shè)計(jì)最通用的方案,然后再使用特定于瀏覽器的技術(shù)增強(qiáng)該方案。
能力檢測(cè)(性能檢測(cè)) 基本模式語(yǔ)法目標(biāo)不是識(shí)別特定的瀏覽器,而是識(shí)別瀏覽器的能力。基本模式如下:
if (object.propertyInQuestion){ //使用object.propertyInQuestion }
舉個(gè)例子,比如 IE5.0 之前的版本不支持 document.getElementById() 這個(gè) DOM 方法。但可以使用 document.all[] 方法。于是可以寫下如下代碼:
function getElement(id){ if (document.getElementById){ return document.getElementById(id); }else if (document.getAll){ return document.getAll[id]; }else{ throw new Erroor("No way to retrieve element !"); } }能力檢測(cè)使用的要點(diǎn)
先檢測(cè)達(dá)成目的的最常用的特性,可以保證代碼最優(yōu)化,并避免檢測(cè)多個(gè)條件;
必須測(cè)試實(shí)際要是用到的特性;
對(duì)于第二點(diǎn):
function getWindowWidth(){ if (document.all){ //假設(shè)是 IE 瀏覽器 return document.documentElement.clientWidth; //錯(cuò)誤!不一定是 IE 瀏覽器 } else { return window.innerWidth; } }
如Opera 支持document.all,也支持window.innerWidth;所以上述代碼用法上有問(wèn)題。
更可靠的能力檢測(cè)能力檢測(cè)對(duì)于想知道某個(gè)特性是否會(huì)按照適當(dāng)方式行事非常有用。如檢測(cè)對(duì)象是否支持排序:
function isSortable(obj){ return typeof obj.sort == "function"; } var obj1 = [321,43215,1]; var obj2 = { name: "Oliver", age: 18 }; console.log(isSortable(obj1)); //true console.log(isSortable(obj2)); /false
這里需要注意的是,能力檢測(cè)不是只檢測(cè)相應(yīng)的方法是否存在?。?!
function isSortable(obj){ return !!obj.sort; } var obj1 = [321,43215,1]; var obj2 = { name: "Oliver", age: 18, sort: true }; console.log(isSortable(obj1)); //true console.log(isSortable(obj2)); //true
這里就可以看出問(wèn)題了,能力檢測(cè)不是檢測(cè)相應(yīng)的方法是否存在,obj2 中定義了 sort 屬性,仍然可以通過(guò)所謂的能力檢測(cè)檢測(cè)為 true。
所以在可能的情況下,要盡量使用 typeof 進(jìn)行能力檢測(cè)。
而在 IE 中,情況又不同了:
function hasCreateElement(){ return typeof document.createElement == "function"; }
在 IE8 之前,這個(gè)函數(shù)返回 false,因?yàn)?typeof document.createElement 返回的是"object",而不是“function”。因?yàn)?IE 及更早版本中的宿主對(duì)象是通過(guò) COM 而非 JScript 實(shí)現(xiàn)的。但 IE9 中糾正了這個(gè)問(wèn)題,對(duì)所有 DOM 方法都返回“function”。
能力檢測(cè),不是瀏覽器檢測(cè)在實(shí)際開(kāi)發(fā)中,應(yīng)該將能力檢測(cè)作為確定下一步解決方案的依據(jù),而不是用他來(lái)判斷用戶使用的是什么瀏覽器。如:
var hasNSPlugins = !!(navigator.plugins && navigator.plugins.length); var hasDOM1 = !!(document.getElementById && document.getElementsByTagName && document.createElement);
上述代碼一個(gè)是用來(lái)確定瀏覽器是否支持 Netscapte 風(fēng)格的插件;另一個(gè)是用來(lái)確定瀏覽器是否具備 DOM1 級(jí)所規(guī)定的能力。
怪癖檢測(cè)目標(biāo)是識(shí)別瀏覽器的特殊行為。怪癖檢測(cè)是想要知道瀏覽器存在什么缺陷。如,IE8 及更早版本中存在一個(gè) bug,即如果某個(gè)實(shí)例屬性與[[Enumerable]]標(biāo)記為 false 的某個(gè)原型屬性同名,那么該實(shí)例就不會(huì)出現(xiàn)在 for-in 循環(huán)當(dāng)中??梢允褂靡韵麓a來(lái)檢測(cè)這種“怪癖”:
var hasDontEnumQuirk = function(){ var o = { toString : function(){} }; for (var prop in o){ if (prop == "toString"){ return false; } } return true; }();
另外,在 Safari 3 以前的版本中會(huì)枚舉被隱藏的屬性??梢杂孟旅娴暮瘮?shù)來(lái)檢測(cè):
var hasEnumShadowsQuirk = function(){ var o = { toString : function(){} } var count = 0; for (var prop in o){ if (prop == "toString"){ count++; } } return (count > 1); }();
如果瀏覽器存在這個(gè) bug,那么使用 for-in 循環(huán)枚舉帶有自定義的 toString() 方法的對(duì)象,就會(huì)返回兩個(gè) toString 的實(shí)例。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78240.html
摘要:由于怪癖檢測(cè)無(wú)法精確地檢測(cè)特定的瀏覽器和版本。用戶代理檢測(cè)需要特殊的技巧,特別是要注意會(huì)隱瞞其用戶代理字符串的情況。而在客戶端,用戶代理檢測(cè)一般被當(dāng)作一種萬(wàn)不得已的做法,其優(yōu)先級(jí)排在能力檢測(cè)和怪癖檢測(cè)之后。 能力檢測(cè) 在編寫代碼之前先檢測(cè)特定瀏覽器的能力。例如,腳本在調(diào)用某個(gè)函數(shù)之前,可能要先檢測(cè)該函數(shù)首付存在。這種檢測(cè)方法將開(kāi)發(fā)人員從考慮具體的瀏覽器類型和版本中解放出來(lái),讓他們把注意...
摘要:和級(jí)分為許多模塊,分別描述了的某個(gè)非常具體的子集。這些模塊主要有核心視圖事件樣式遍歷和范圍以及。另外還有方法和方法框架的變化框架和內(nèi)嵌框架分別用和表示,它們?cè)诩?jí)中都有一個(gè)新屬性這個(gè)屬性包含一個(gè)指針,指向表示框架內(nèi)容的文檔對(duì)象。 DOM2和DOM3級(jí)分為許多模塊,分別描述了DOM的某個(gè)非常具體的子集。這些模塊主要有核心(Core)、視圖(Views)、事件(Events)、樣式(Styl...
摘要:個(gè)人認(rèn)為兼容性的問(wèn)題也是對(duì)這三個(gè)方面進(jìn)行處理。能力檢測(cè)需要注意兩點(diǎn)先檢測(cè)達(dá)成目的的最常用的特性,可以保證代碼最優(yōu)化,并避免檢測(cè)多個(gè)條件必須測(cè)試實(shí)際要是用到的特性這些就是小可對(duì)兼容性的理解,有不對(duì)的希望各位朋友指正探討,嘻嘻 這里和朋友們簡(jiǎn)單探討一下個(gè)人對(duì)于前端兼容性的一些理解: 在項(xiàng)目中,前端主要處理html,css,javaScript代碼,當(dāng)然還有可能接觸到razor等渲染引擎方面...
摘要:個(gè)人認(rèn)為兼容性的問(wèn)題也是對(duì)這三個(gè)方面進(jìn)行處理。能力檢測(cè)需要注意兩點(diǎn)先檢測(cè)達(dá)成目的的最常用的特性,可以保證代碼最優(yōu)化,并避免檢測(cè)多個(gè)條件必須測(cè)試實(shí)際要是用到的特性這些就是小可對(duì)兼容性的理解,有不對(duì)的希望各位朋友指正探討,嘻嘻 這里和朋友們簡(jiǎn)單探討一下個(gè)人對(duì)于前端兼容性的一些理解: 在項(xiàng)目中,前端主要處理html,css,javaScript代碼,當(dāng)然還有可能接觸到razor等渲染引擎方面...
摘要:個(gè)人認(rèn)為兼容性的問(wèn)題也是對(duì)這三個(gè)方面進(jìn)行處理。能力檢測(cè)需要注意兩點(diǎn)先檢測(cè)達(dá)成目的的最常用的特性,可以保證代碼最優(yōu)化,并避免檢測(cè)多個(gè)條件必須測(cè)試實(shí)際要是用到的特性這些就是小可對(duì)兼容性的理解,有不對(duì)的希望各位朋友指正探討,嘻嘻 這里和朋友們簡(jiǎn)單探討一下個(gè)人對(duì)于前端兼容性的一些理解: 在項(xiàng)目中,前端主要處理html,css,javaScript代碼,當(dāng)然還有可能接觸到razor等渲染引擎方面...
閱讀 1881·2021-11-15 11:39
閱讀 1088·2020-12-03 17:06
閱讀 742·2019-12-27 11:42
閱讀 3277·2019-08-30 13:59
閱讀 1469·2019-08-26 13:22
閱讀 3291·2019-08-26 12:15
閱讀 2479·2019-08-26 10:22
閱讀 1566·2019-08-23 18:40