1. 程式人生 > >Js之Navigator對象

Js之Navigator對象

int 檢測 strong blog 操作 有時 表示 mpat tle

Window對象的navigator屬性引用的是包含瀏覽器廠商和版本信息的Navigator對象。Navigator對象的命名是為了紀念Netscape之後NavigatorBU覽器譯註2,不過所有其他的瀏覽器也支持它(IE還支持clientln formation屬性,它作為navigator的廠商中立同義
詞。遺憾的是,其他瀏覽器並不支持這一更直觀的屬性命名)。過去,Navigator對象通常被腳本用來確定它們是在IE中還是在Netscape中運行。這種瀏覽器嗅探方法有問題,因為它要求隨著新瀏覽器和現有瀏覽器的新版本的引入而不斷地
調整。如今,有一種更好的功能測試方法(參見13.4.3節),只需要測試所需要的功能(即,方法或屬性),而不是偎設特定的瀏覽器版本及其功能。然而,瀏覽器嗅探有時候仍然有價值。這樣的一種情況是,當需要解決存在於某個特定

的瀏覽器的特定版本中的特殊的bug時。Navigator對象有4個屬性用於提供關於運行中的瀏覽器的版本信息,並且可以使用這些屬性進行瀏覽器嗅探。

appName
Web瀏覽器的全稱。在IE中,這就是“Microsoft Internet Explorer”。在Firefox中,該屬性就是“Netscape”。為了兼容現存的瀏覽器嗅探代碼,其他瀏覽器通常也取值為“Netscape”。
appVersion
此屬性通常以數字開始,並跟著包含瀏覽器廠商和版本信息的詳細字符串。字符串前面的數字通常是4.0或5.0,表示它是第4或第5代兼容的瀏覽器。appVersion字符串沒有標準的格式,所以,沒有辦法直接用它來判斷瀏覽器的類型。

userAgent
瀏覽器.在它的USER-AGENT HTTP頭部中發送的字符串。這個屬性通常包含appVersion中的所有信息,並且常常也可能包含其他的細節。和appVersion-樣,它也沒有標準的格式。由於這個屬性包含絕大部分信息,因此瀏覽器嗅探代碼通常用它來嗅探。
platform
在其上運行瀏覽器的操作系統(並且可能是硬件)的字符串。Navigator屬性的復雜性正說明了瀏覽器嗅探對於處理客戶端兼容性問題是沒有太大幫助的。在Web的早期,人們寫了大量的瀏覽器特定代碼用於測試類似於navigator.appName
的屬性。在開發新瀏覽器的時候,瀏覽器廠商發現為了讓現有網站顯示正確,它們需要把appName設置為“Netscape”。類似的做法使得appVersion的起始數字失去了意義,而現在的瀏覽器嗅探代碼必須要依賴於比之前復雜很多的navigator.userAgent字符串。
例14-3展示了如何用正則表達式(摘自iQuery)從navigator.userAgent中抽取瀏覽器名稱和版本號的方法。

復制代碼
例14-3:使用navigator.userAgent~-進行瀏覽器嗅探
//為客戶端嗅探定義browser.name和browser.version,這裏使用了jOuery l.4.1中的代碼
//name和number都是字符串,對於不同的瀏覽器輸出的結果也是不一樣的,檢測結果如下:
J|
//”webkit":Safari或Chrome;版本號是Webkit的版本號
//”opera": Opera;版本號就是軟件的版本號
//“mozilla":Firefox或者其他基於gecko內核的瀏覽器;版本號是Gecko的版本
//”msie":IE;版本號就是軟件的版本
||
//比如Firefox 3.6返回:{name: "mozilla", version: "1.9.2"}
var browser=(function(){
var s=navigator.userAgent.toLowerCase();
var match=/(webkit)[\/]([\w.]+)/.exec(s) ||
/(opera)(?: .*version)?[\/]([\w.]+)/.exec(s) ||
/(msie)([\w.]+)/.exec(s) ||
/compatible/.test(s)&&/(mozilla)(?:.*rv:([\w.]+))?/.exec(s)I l
[];

Js之Navigator對象