|
原文作者:Peter-Paul Koch
以下為對(duì)原文的翻譯:
判斷對(duì)象存在的方法
很快你就會(huì)注意到,JavaScript的部分功能在部分瀏覽器中無(wú)效。如果你要使用一些腳本的高級(jí)特性,你首先要檢查瀏覽器是否支持要使用的對(duì)象,本文具體說(shuō)明判斷的正確方法。
通過(guò)判斷瀏覽器的版本:不!
如果你想知道瀏覽器是否支持代碼中使用的那些對(duì)象,記住,永遠(yuǎn)都不要通過(guò)瀏覽器的版本來(lái)判斷。我確定你知道,有些瀏覽器支持你的代碼,而有些瀏覽器不支持你的代碼,可是你考慮過(guò)其他的瀏覽器么?那些不知名的小瀏覽器?
就算你可以檢測(cè)出90%的用戶所使用的瀏覽器及版本,還是有一些不出名的瀏覽器不能正確運(yùn)行你的代碼,結(jié)果要么是一大堆異常信息,要么是某些腳本沒(méi)有被正確的執(zhí)行。不管是哪種情況,你都是在使用漏洞百出的代碼欺騙最終瀏覽網(wǎng)站的用戶。
個(gè)案研究:mouseovers
一個(gè)古老的個(gè)案可以證實(shí)上述的說(shuō)法。雖然這種情況現(xiàn)在已經(jīng)不存在,但是同樣原理的例子還是存在的。
一個(gè)公認(rèn)的事實(shí)就是IE 3不支持document.images這個(gè)數(shù)組,但這個(gè)數(shù)組對(duì)mouseover腳本又是極為重要。所以我們就應(yīng)該禁止mouseover腳本在IE 3瀏覽器中執(zhí)行。解決方案之一就是對(duì)瀏覽器進(jìn)行判斷,當(dāng)判斷出用戶使用的瀏覽器是IE 3的時(shí)候,就不執(zhí)行這個(gè)函數(shù)。
但是,在大多數(shù)操作系統(tǒng)中,NETscape 2瀏覽器同樣不支持document.images數(shù)組。如果你僅僅判斷瀏覽器是不是IE 3,那么使用NETscape 2的用戶就會(huì)看到一大堆異常信息。
那為什么不連同NETscape 2一起檢測(cè)呢?因?yàn)榫退氵@樣做也是無(wú)事于補(bǔ)。
運(yùn)行在OS/2上的NETscape 2是和NETscape 3完全兼容的,而且可以很好的處理mouseover效果。盡管如此,大家為什么還會(huì)經(jīng)??床坏竭@個(gè)效果呢?因?yàn)閣eb開(kāi)發(fā)者使用了瀏覽器檢測(cè)的手段,在 mouseover腳本中屏蔽了NETscape 2瀏覽器。因此開(kāi)發(fā)者們,在沒(méi)有充足理由的情況下,剝奪了用戶擁有良好互動(dòng)體驗(yàn)的權(quán)利。合適的對(duì)象檢測(cè)方法可以避免這種情況的發(fā)生。
最后,越來(lái)越多的瀏覽器允許用戶把瀏覽器的認(rèn)證字符串修改為自己喜歡的內(nèi)容,這樣就存在很大的可能性,檢測(cè)不出用戶真實(shí)使用的瀏覽器以及版本,自然就不能保證無(wú)故障的運(yùn)行代碼了。由此,web開(kāi)發(fā)者再次剝奪了用戶額外互動(dòng)效果的權(quán)利。更糟的是,這樣的代碼通常寫(xiě)的很爛。
既然瀏覽器的版本不可靠,那么是否JavaScript的版本更加可信一些呢?
通過(guò)判斷JavaScript的版本:不!
在最初規(guī)劃的時(shí)候,NETscape完全意識(shí)到未來(lái)的瀏覽器會(huì)支持比現(xiàn)在多得多的對(duì)象,而web開(kāi)發(fā)者必須能夠把新老瀏覽器區(qū)分開(kāi)來(lái)。
起初的計(jì)劃是讓開(kāi)發(fā)者對(duì)瀏覽器的版本進(jìn)行判斷。比如某某瀏覽器只能支持JavaScript 1.x等。在script標(biāo)簽中增加version屬性,這樣如果瀏覽器不支持相應(yīng)版本的JavaScript,自然就不會(huì)執(zhí)行這段腳本。
但是,當(dāng)Microsoft涉足瀏覽器市場(chǎng)后,這個(gè)想法就無(wú)法進(jìn)行下去了。盡管早在NETscape 4和IE 4的時(shí)候就都支持JavaScript 1.2,可是就算再有想象力的人也不會(huì)相信他們支持的是相同的JavaScript 1.2。因?yàn)檫@個(gè)版本號(hào)已經(jīng)過(guò)時(shí)了,而且肯定和對(duì)象檢測(cè)不相干。
所以不要使用JavaScript的版本號(hào)來(lái)做什么,他們沒(méi)什么實(shí)際的作用。
正確的方法:對(duì)象判斷
相反,我們只需通過(guò)簡(jiǎn)單的方法來(lái)判斷瀏覽器是否支持要使用的對(duì)象(或者是方法、數(shù)組或者屬性)。我們還是使用mouseover這個(gè)例子。這段腳本依賴于document.images這個(gè)數(shù)組,所以最重要的事情當(dāng)然是判斷瀏覽器是否支持他,下面是具體的做法:
if (document.images)
{
do something with the images array
}
現(xiàn)在你有了一個(gè)完全的保障,運(yùn)行這段代碼的瀏覽器肯定支持這段腳本。條件語(yǔ)句判斷document.image這個(gè)數(shù)組是否存在,如果返回true,那么這段腳本將會(huì)被執(zhí)行,反之如果這個(gè)數(shù)組不存在,將會(huì)返回false,而且這段腳本肯定不會(huì)被執(zhí)行。
還有一個(gè)常用的檢測(cè)是針對(duì)window.focus的。這是一個(gè)方法(一條你告訴JavaScript要去做什么的命令)。如果我們要使用這個(gè)方法,我們必須首先檢測(cè)瀏覽器是否支持這個(gè)方法。
檢測(cè)函數(shù)是否存在的正確方法如下,牢記千萬(wàn)不要在函數(shù)后面加括號(hào):
if (window.focus)
上面這段代碼的含義是:“瀏覽器是否支持window.focus這個(gè)函數(shù)”,而下面這段代碼的含義不同:
if (window.focus())
這段代碼是對(duì)focus的結(jié)果進(jìn)行判斷,而且已經(jīng)假設(shè)瀏覽器是支持focus方法的,而如果不支持,這時(shí)候就會(huì)報(bào)異常了。加了括號(hào)以后實(shí)際上執(zhí)行了函數(shù),而這并不是我們想要的狀況。所以檢測(cè)的時(shí)候不要加括號(hào),而只有在檢測(cè)通過(guò)后才加上括號(hào)執(zhí)行這個(gè)函數(shù)。比如下面這個(gè)例子:
if (window.focus) window.focus()
重點(diǎn)
以上討論的所有重點(diǎn)就是:在JavaScript中,如果你要使用document.images,首先判斷是否支持document.images。如果你要使用window.focus方法,首先判斷是否瀏覽器是否支持這個(gè)方法。
如果你總是在使用對(duì)象前進(jìn)行檢測(cè),你的腳本將不會(huì)產(chǎn)生類似問(wèn)題的異常,付出的代碼只是有些功能在部分瀏覽器中被屏蔽掉了而已。
譯者注:
任何戰(zhàn)爭(zhēng)都是會(huì)帶來(lái)很多副作用的,本文所介紹的情況主要是發(fā)生在瀏覽器大戰(zhàn)的時(shí)候的,就像冷戰(zhàn)一樣,造成了很多遺留的問(wèn)題。但是后來(lái)ecma- 262標(biāo)準(zhǔn)的實(shí)施,讓這種情況得到些許緩和,可是在ecma-262第三版中明確規(guī)定,允許各家自己對(duì)其進(jìn)行擴(kuò)展,擴(kuò)展的結(jié)果自然就是不兼容,自然要使用 本文的方法進(jìn)行判斷。索性,我們現(xiàn)在只是不用判斷所有的對(duì)象,如果一個(gè)瀏覽器宣布支持ecma-262標(biāo)準(zhǔn),至少我們知道哪些對(duì)象不用判斷,也算是一種慰 藉吧。
JavaScript技術(shù):判斷JavaScript對(duì)象是否可用的最正確方法分析,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。