考慮到歷史原因以及現(xiàn)代瀏覽器中用戶代理字符串的使用方式,通過(guò)用戶代理字符串來(lái)檢測(cè)特定的瀏覽器并不是一件輕松的事。因此南昌網(wǎng)站設(shè)計(jì)公司技術(shù)人員認(rèn)為,首先要確定的往往是你需要多么具體的瀏覽器信息。一般情況 下,知道呈現(xiàn)引擎和最低限度的版本就足以決定正確的操作方法了。例如,我們不推薦使用下列代碼:
if (isIE6 if isIE7){//不推薦! //代碼
}
這個(gè)例子是想要在瀏覽器為IE6或7時(shí)執(zhí)行相應(yīng)代碼。這種代碼其實(shí)是很脆弱的,因?yàn)樗罁?jù)特定的版本來(lái)決定做什么。如果是IE8怎么辦呢?只要IE有新版本出來(lái),就必須更新這些代碼。不過(guò),像下面這樣使用相對(duì)版本號(hào)則可以避免此問(wèn)題:
if (ieVer>=6){ //代碼
)
這個(gè)例子首先檢測(cè)IE的版本號(hào)是否至少等于6,如果是則執(zhí)行相應(yīng)操作。這樣就可以確保相應(yīng)的代碼將來(lái)照樣能夠起作用。我們下面的瀏覽器檢測(cè)腳本就將本著這種思路來(lái)編寫(xiě)。
如前所述,確切知道瀏覽器的名字和版本號(hào)不如確切知道它使用的是什么呈現(xiàn)引擎。如果Firefox、 Camino和Netscape都使用相同版本的Gecko,那它們一定支持相同的特性。類似地,不管是什么瀏覽器,只要它跟Safari 3使用的是同一個(gè)版本的WebKit,那么該瀏覽器也就跟Safari 3具備同樣的功能。 因此,我們要編寫(xiě)的腳本將主要檢測(cè)五大呈現(xiàn)引擎:IE.Gecko.WebKit.KHTML和Opera。
為了不在全局作用域中添加多余的變量,我們將使用模塊增強(qiáng)模式來(lái)封裝檢測(cè)腳本。檢測(cè)腳本的基本代碼結(jié)構(gòu)如下所示:
var client=function(){
//呈現(xiàn)引擎
var engine={
ie: O,
gecko:0,
webkit:0,
khtml:0.
opera:O,
//具體的版本號(hào)
ver:null
};
//在此檢測(cè)呈現(xiàn)引擎、平臺(tái)和設(shè)備
return(
engine : engine
};
}();
這里聲明了一個(gè)名為client的全局變量,用于保存相關(guān)信息。匿名函數(shù)內(nèi)部定義了一個(gè)局部變量engine,它是一個(gè)包含默認(rèn)設(shè)置的對(duì)象字面量。在這個(gè)對(duì)象字面量中,每個(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屬性。作這樣的區(qū)分可以支持像下面這樣編寫(xiě)代碼:
if(client.engine.ie){//如果是IE,client.ie的值應(yīng)該大于0
//針對(duì)IE的代碼
} else if (client.engine.gecko>1.5)(
if (client.englne.ver=="1.8.1"){
//針對(duì)這個(gè)版本執(zhí)行某些操作
}
}
在檢測(cè)到一個(gè)呈現(xiàn)引擎之后,其client.engine中對(duì)應(yīng)的屬性將被設(shè)置為一個(gè)大于0的值,該值可以轉(zhuǎn)換成布爾值true。這樣,就可以在if語(yǔ)句中檢測(cè)相應(yīng)的屬性,以確定當(dāng)前使用的呈現(xiàn)引擎,連具體的版本號(hào)都不必考慮。鑒于每個(gè)屬性都包含一個(gè)浮點(diǎn)數(shù)值,因此有可能丟失某些版本信息。例如,將字符串”1.8.1傳入parseFloat()后會(huì)得到數(shù)值1.8。不過(guò),在必要的時(shí)候可以檢測(cè)ver屬性,該屬性中會(huì)保存完整的版本信息。
要正確地識(shí)別呈現(xiàn)引擎,關(guān)鍵是檢測(cè)順序要正確。由于用戶代理字符串存在諸多不一致的地方,如果檢測(cè)順序不對(duì),很可能會(huì)導(dǎo)致檢測(cè)結(jié)果不正確。為此,第一步就是識(shí)別Opera,因?yàn)樗挠脩舸碜址锌赡芡耆7缕渌麨g覽器。我們不相信Opera,是因?yàn)?任何情況下)其用戶代理字符串(都)不會(huì)將自己標(biāo)識(shí)為Opera。
要識(shí)別Opera,必須得檢測(cè)window.opera對(duì)象。Opera 5及更高版本中都有這個(gè)對(duì)象,用以保存與瀏覽器相關(guān)的標(biāo)識(shí)信息以及與瀏覽器直接交互。在Opera 7.6及更高版本中,調(diào)用version()方法可以返回一個(gè)表示瀏覽器版本的字符串,而這也是確定Opera版本號(hào)的最佳方式。要檢測(cè)更早版本的 Opera,可以直接檢查用戶代理字符串,因?yàn)槟切┌姹具€不支持隱瞞身份。不過(guò),2007底Opera的最高版本已經(jīng)是9.5了,所以不太可能有人還在使用7.6之前的版本。那么,檢測(cè)呈現(xiàn)引擎代碼的第一步,就是編寫(xiě)如下代碼:
if (window.opera){
engine.ver=window.opera.version();
engine.opera=parseFloat( engine.ver);
}
這里,將版本的字符串表示保存在了englne.ver中,將浮點(diǎn)數(shù)值表示的版本保存在了egine.opera中。如果瀏覽器是Opera,測(cè)試window.opera就會(huì)返回true;否則,就要看看是其他的什么瀏覽器了。
本文僅限內(nèi)部技術(shù)人員學(xué)習(xí)交流,不得作于其他商業(yè)用途.文章出自:南昌網(wǎng)站建設(shè)公司-百恒網(wǎng)絡(luò) http://www.gimmickmag.com 如轉(zhuǎn)載請(qǐng)注明出處!