| 導購 | 订阅 | 在线投稿
分享
 
 
 

判斷JavaScript對象是否可用的正確方法

來源:互聯網  2008-10-21 08:21:14  評論

原文:http://www.quirksmode.org/js/support.html

原文作者:Peter-Paul Koch

以下爲對原文的翻譯:

判斷對象存在的方法

很快你就會注意到,JavaScript的部分功能在部分浏覽器中無效。如果你要使用一些腳本的高級特性,你首先要檢查浏覽器是否支持要使用的對象,本文具體說明判斷的正確方法。

通過判斷浏覽器的版本:不!

如果你想知道浏覽器是否支持代碼中使用的那些對象,記住,永遠都不要通過浏覽器的版本來判斷。我確定你知道,有些浏覽器支持你的代碼,而有些浏覽器不支持你的代碼,可是你考慮過其他的浏覽器麽?那些不知名的小浏覽器?

就算你可以檢測出90%的用戶所使用的浏覽器及版本,還是有一些不出名的浏覽器不能正確運行你的代碼,結果要麽是一大堆異常信息,要麽是某些腳本沒有被正確的執行。不管是哪種情況,你都是在使用漏洞百出的代碼欺騙最終浏覽網站的用戶。

個案研究:mouseovers

一個古老的個案可以證實上述的說法。雖然這種情況現在已經不存在,但是同樣原理的例子還是存在的。

一個公認的事實就是IE 3不支持document.images這個數組,但這個數組對mouseover腳本又是極爲重要。所以我們就應該禁止mouseover腳本在IE 3浏覽器中執行。解決方案之一就是對浏覽器進行判斷,當判斷出用戶使用的浏覽器是IE 3的時候,就不執行這個函數。

但是,在大多數操作系統中,Netscape 2浏覽器同樣不支持document.images數組。如果你僅僅判斷浏覽器是不是IE 3,那麽使用Netscape 2的用戶就會看到一大堆異常信息。

那爲什麽不連同Netscape 2一起檢測呢?因爲就算這樣做也是無事于補。

運行在OS/2上的Netscape 2是和Netscape 3完全兼容的,而且可以很好的處理mouseover效果。盡管如此,大家爲什麽還會經常看不到這個效果呢?因爲web開發者使用了浏覽器檢測的手段,在 mouseover腳本中屏蔽了Netscape 2浏覽器。因此開發者們,在沒有充足理由的情況下,剝奪了用戶擁有良好互動體驗的權利。合適的對象檢測方法可以避免這種情況的發生。

最後,越來越多的浏覽器允許用戶把浏覽器的認證字符串修改爲自己喜歡的內容,這樣就存在很大的可能性,檢測不出用戶真實使用的浏覽器以及版本,自然就不能保證無故障的運行代碼了。由此,web開發者再次剝奪了用戶額外互動效果的權利。更糟的是,這樣的代碼通常寫的很爛。

既然浏覽器的版本不可靠,那麽是否JavaScript的版本更加可信一些呢?

通過判斷JavaScript的版本:不!

在最初規劃的時候,Netscape完全意識到未來的浏覽器會支持比現在多得多的對象,而web開發者必須能夠把新老浏覽器區分開來。

起初的計劃是讓開發者對浏覽器的版本進行判斷。比如某某浏覽器只能支持JavaScript 1.x等。在script標簽中增加version屬性,這樣如果浏覽器不支持相應版本的JavaScript,自然就不會執行這段腳本。

但是,當Microsoft涉足浏覽器市場後,這個想法就無法進行下去了。盡管早在Netscape 4和IE 4的時候就都支持JavaScript 1.2,可是就算再有想象力的人也不會相信他們支持的是相同的JavaScript 1.2。因爲這個版本號已經過時了,而且肯定和對象檢測不相幹。

所以不要使用JavaScript的版本號來做什麽,他們沒什麽實際的作用。

正確的方法:對象判斷

相反,我們只需通過簡單的方法來判斷浏覽器是否支持要使用的對象(或者是方法、數組或者屬性)。我們還是使用mouseover這個例子。這段腳本依賴于document.images這個數組,所以最重要的事情當然是判斷浏覽器是否支持他,下面是具體的做法:

if (document.images)

{

do something with the images array

}

現在你有了一個完全的保障,運行這段代碼的浏覽器肯定支持這段腳本。條件語句判斷document.image這個數組是否存在,如果返回true,那麽這段腳本將會被執行,反之如果這個數組不存在,將會返回false,而且這段腳本肯定不會被執行。

還有一個常用的檢測是針對window.focus的。這是一個方法(一條你告訴JavaScript要去做什麽的命令)。如果我們要使用這個方法,我們必須首先檢測浏覽器是否支持這個方法。

檢測函數是否存在的正確方法如下,牢記千萬不要在函數後面加括號:

if (window.focus)

上面這段代碼的含義是:「浏覽器是否支持window.focus這個函數」,而下面這段代碼的含義不同:

if (window.focus())

這段代碼是對focus的結果進行判斷,而且已經假設浏覽器是支持focus方法的,而如果不支持,這時候就會報異常了。加了括號以後實際上執行了函數,而這並不是我們想要的狀況。所以檢測的時候不要加括號,而只有在檢測通過後才加上括號執行這個函數。比如下面這個例子:

if (window.focus) window.focus()

重點

以上討論的所有重點就是:在JavaScript中,如果你要使用document.images,首先判斷是否支持document.images。如果你要使用window.focus方法,首先判斷是否浏覽器是否支持這個方法。

如果你總是在使用對象前進行檢測,你的腳本將不會産生類似問題的異常,付出的代碼只是有些功能在部分浏覽器中被屏蔽掉了而已。

譯者注:

任何戰爭都是會帶來很多副作用的,本文所介紹的情況主要是發生在浏覽器大戰的時候的,就像冷戰一樣,造成了很多遺留的問題。但是後來ecma- 262標准的實施,讓這種情況得到些許緩和,可是在ecma-262第三版中明確規定,允許各家自己對其進行擴展,擴展的結果自然就是不兼容,自然要使用 本文的方法進行判斷。索性,我們現在只是不用判斷所有的對象,如果一個浏覽器宣布支持ecma-262標准,至少我們知道哪些對象不用判斷,也算是一種慰 藉吧。

張貼者 明達 時間: 10/01/2008 01:56:00 下午

原文:[url=http://www.quirksmode.org/js/support.html]http://www.quirksmode.org/js/support.html[/url] 原文作者:Peter-Paul Koch 以下爲對原文的翻譯: 判斷對象存在的方法 很快你就會注意到,JavaScript的部分功能在部分浏覽器中無效。如果你要使用一些腳本的高級特性,你首先要檢查浏覽器是否支持要使用的對象,本文具體說明判斷的正確方法。 通過判斷浏覽器的版本:不! 如果你想知道浏覽器是否支持代碼中使用的那些對象,記住,永遠都不要通過浏覽器的版本來判斷。我確定你知道,有些浏覽器支持你的代碼,而有些浏覽器不支持你的代碼,可是你考慮過其他的浏覽器麽?那些不知名的小浏覽器? 就算你可以檢測出90%的用戶所使用的浏覽器及版本,還是有一些不出名的浏覽器不能正確運行你的代碼,結果要麽是一大堆異常信息,要麽是某些腳本沒有被正確的執行。不管是哪種情況,你都是在使用漏洞百出的代碼欺騙最終浏覽網站的用戶。 個案研究:mouseovers 一個古老的個案可以證實上述的說法。雖然這種情況現在已經不存在,但是同樣原理的例子還是存在的。 一個公認的事實就是IE 3不支持document.images這個數組,但這個數組對mouseover腳本又是極爲重要。所以我們就應該禁止mouseover腳本在IE 3浏覽器中執行。解決方案之一就是對浏覽器進行判斷,當判斷出用戶使用的浏覽器是IE 3的時候,就不執行這個函數。 但是,在大多數操作系統中,Netscape 2浏覽器同樣不支持document.images數組。如果你僅僅判斷浏覽器是不是IE 3,那麽使用Netscape 2的用戶就會看到一大堆異常信息。 那爲什麽不連同Netscape 2一起檢測呢?因爲就算這樣做也是無事于補。 運行在OS/2上的Netscape 2是和Netscape 3完全兼容的,而且可以很好的處理mouseover效果。盡管如此,大家爲什麽還會經常看不到這個效果呢?因爲web開發者使用了浏覽器檢測的手段,在 mouseover腳本中屏蔽了Netscape 2浏覽器。因此開發者們,在沒有充足理由的情況下,剝奪了用戶擁有良好互動體驗的權利。合適的對象檢測方法可以避免這種情況的發生。 最後,越來越多的浏覽器允許用戶把浏覽器的認證字符串修改爲自己喜歡的內容,這樣就存在很大的可能性,檢測不出用戶真實使用的浏覽器以及版本,自然就不能保證無故障的運行代碼了。由此,web開發者再次剝奪了用戶額外互動效果的權利。更糟的是,這樣的代碼通常寫的很爛。 既然浏覽器的版本不可靠,那麽是否JavaScript的版本更加可信一些呢? 通過判斷JavaScript的版本:不! 在最初規劃的時候,Netscape完全意識到未來的浏覽器會支持比現在多得多的對象,而web開發者必須能夠把新老浏覽器區分開來。 起初的計劃是讓開發者對浏覽器的版本進行判斷。比如某某浏覽器只能支持JavaScript 1.x等。在script標簽中增加version屬性,這樣如果浏覽器不支持相應版本的JavaScript,自然就不會執行這段腳本。 但是,當Microsoft涉足浏覽器市場後,這個想法就無法進行下去了。盡管早在Netscape 4和IE 4的時候就都支持JavaScript 1.2,可是就算再有想象力的人也不會相信他們支持的是相同的JavaScript 1.2。因爲這個版本號已經過時了,而且肯定和對象檢測不相幹。 所以不要使用JavaScript的版本號來做什麽,他們沒什麽實際的作用。 正確的方法:對象判斷 相反,我們只需通過簡單的方法來判斷浏覽器是否支持要使用的對象(或者是方法、數組或者屬性)。我們還是使用mouseover這個例子。這段腳本依賴于document.images這個數組,所以最重要的事情當然是判斷浏覽器是否支持他,下面是具體的做法: if (document.images) { do something with the images array } 現在你有了一個完全的保障,運行這段代碼的浏覽器肯定支持這段腳本。條件語句判斷document.image這個數組是否存在,如果返回true,那麽這段腳本將會被執行,反之如果這個數組不存在,將會返回false,而且這段腳本肯定不會被執行。 還有一個常用的檢測是針對window.focus的。這是一個方法(一條你告訴JavaScript要去做什麽的命令)。如果我們要使用這個方法,我們必須首先檢測浏覽器是否支持這個方法。 檢測函數是否存在的正確方法如下,牢記千萬不要在函數後面加括號: if (window.focus) 上面這段代碼的含義是:「浏覽器是否支持window.focus這個函數」,而下面這段代碼的含義不同: if (window.focus()) 這段代碼是對focus的結果進行判斷,而且已經假設浏覽器是支持focus方法的,而如果不支持,這時候就會報異常了。加了括號以後實際上執行了函數,而這並不是我們想要的狀況。所以檢測的時候不要加括號,而只有在檢測通過後才加上括號執行這個函數。比如下面這個例子: if (window.focus) window.focus() 重點 以上討論的所有重點就是:在JavaScript中,如果你要使用document.images,首先判斷是否支持document.images。如果你要使用window.focus方法,首先判斷是否浏覽器是否支持這個方法。 如果你總是在使用對象前進行檢測,你的腳本將不會産生類似問題的異常,付出的代碼只是有些功能在部分浏覽器中被屏蔽掉了而已。 譯者注: 任何戰爭都是會帶來很多副作用的,本文所介紹的情況主要是發生在浏覽器大戰的時候的,就像冷戰一樣,造成了很多遺留的問題。但是後來ecma- 262標准的實施,讓這種情況得到些許緩和,可是在ecma-262第三版中明確規定,允許各家自己對其進行擴展,擴展的結果自然就是不兼容,自然要使用 本文的方法進行判斷。索性,我們現在只是不用判斷所有的對象,如果一個浏覽器宣布支持ecma-262標准,至少我們知道哪些對象不用判斷,也算是一種慰 藉吧。 張貼者 明達 時間: 10/01/2008 01:56:00 下午
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有