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