最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2008年10月03日 00:20:08   作者:  
在調(diào)試JavaScript的過程中,你是不是經(jīng)常會遇到object undefined的問題呢?你平時是怎樣來測試對象是否存在呢?判斷瀏覽器版本?判斷JavaScript版本?本文來告訴你正確的方法。這篇文章涉及的瀏覽器可能古老一些,但是闡述的道理確實適合現(xiàn)在使用的。
原文:http://www.quirksmode.org/js/support.html
原文作者:Peter-Paul Koch

以下為對原文的翻譯:

判斷對象存在的方法

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

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

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

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

個案研究:mouseovers

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

一個公認(rèn)的事實就是IE 3不支持document.images這個數(shù)組,但這個數(shù)組對mouseover腳本又是極為重要。所以我們就應(yīng)該禁止mouseover腳本在IE 3瀏覽器中執(zhí)行。解決方案之一就是對瀏覽器進(jìn)行判斷,當(dāng)判斷出用戶使用的瀏覽器是IE 3的時候,就不執(zhí)行這個函數(shù)。

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

那為什么不連同Netscape 2一起檢測呢?因為就算這樣做也是無事于補(bǔ)。

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

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

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

通過判斷JavaScript的版本:不!

在最初規(guī)劃的時候,Netscape完全意識到未來的瀏覽器會支持比現(xiàn)在多得多的對象,而web開發(fā)者必須能夠把新老瀏覽器區(qū)分開來。

起初的計劃是讓開發(fā)者對瀏覽器的版本進(jìn)行判斷。比如某某瀏覽器只能支持JavaScript 1.x等。在script標(biāo)簽中增加version屬性,這樣如果瀏覽器不支持相應(yīng)版本的JavaScript,自然就不會執(zhí)行這段腳本。

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

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

正確的方法:對象判斷

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

if (document.images)
{
do something with the images array
}

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

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

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

if (window.focus)

上面這段代碼的含義是:“瀏覽器是否支持window.focus這個函數(shù)”,而下面這段代碼的含義不同:

if (window.focus())

這段代碼是對focus的結(jié)果進(jìn)行判斷,而且已經(jīng)假設(shè)瀏覽器是支持focus方法的,而如果不支持,這時候就會報異常了。加了括號以后實際上執(zhí)行了函數(shù),而這并不是我們想要的狀況。所以檢測的時候不要加括號,而只有在檢測通過后才加上括號執(zhí)行這個函數(shù)。比如下面這個例子:

if (window.focus) window.focus()

重點

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

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

譯者注:

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

相關(guān)文章

  • js中遍歷Map對象的方法

    js中遍歷Map對象的方法

    下面小編就為大家?guī)硪黄猨s中遍歷Map對象的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 手把手教你用JS實現(xiàn)回車評論功能

    手把手教你用JS實現(xiàn)回車評論功能

    最近在寫一個問答功能,類似于評論,下面這篇文章主要給大家介紹了關(guān)于如何用JS實現(xiàn)回車評論功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • JS錨點的設(shè)置與使用方法

    JS錨點的設(shè)置與使用方法

    這篇文章主要介紹了JS錨點的設(shè)置與使用方法,涉及javascript針對頁面元素屬性的簡單動態(tài)操作技巧,需要的朋友可以參考下
    2016-09-09
  • discuz表情的JS提取方法分析

    discuz表情的JS提取方法分析

    這篇文章主要介紹了discuz表情的JS提取方法,簡單分析了discuz中表情JS文件調(diào)用的原理與相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • 微信小程序?qū)崿F(xiàn)手勢解鎖的示例詳解

    微信小程序?qū)崿F(xiàn)手勢解鎖的示例詳解

    手勢解鎖是生活中常用的解鎖方式,本文將通過微信小程序?qū)崿F(xiàn)手勢解鎖這一功能,本實例以工具的形式可以嵌入到不同的項目之中,感興趣的可以了解一下
    2022-04-04
  • JavaScript?中的行繼續(xù)符操作

    JavaScript?中的行繼續(xù)符操作

    JavaScript?中的字符串操作可能很復(fù)雜,?盡管字符串操作易于掌握,但實施起來卻具有挑戰(zhàn)性,其中一個相關(guān)領(lǐng)域是添加新行,這篇文章主要介紹了JavaScript中的行繼續(xù)符操作,需要的朋友可以參考下
    2023-06-06
  • JavaScript實現(xiàn)為指定對象添加多個事件處理程序的方法

    JavaScript實現(xiàn)為指定對象添加多個事件處理程序的方法

    這篇文章主要介紹了JavaScript實現(xiàn)為指定對象添加多個事件處理程序的方法,可實現(xiàn)讓指定對象處理多個事件的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Bootstrap3.0建站教程(一)之bootstrap表單元素排版

    Bootstrap3.0建站教程(一)之bootstrap表單元素排版

    本文給大家介紹Bootstrap3.0建站教程(一)之bootstrap表單元素排版,本文給大家列舉了文字和輸入框前后排列和上下排列的實例代碼,有需要的朋友參考下吧
    2016-06-06
  • 微信小程序中的輪播圖實現(xiàn)示例

    微信小程序中的輪播圖實現(xiàn)示例

    打開一個小程序,我們會發(fā)現(xiàn),一般構(gòu)圖排版都是圖片banner - 快捷按鈕 - 產(chǎn)品/文章列表等詳細(xì)信息,底部導(dǎo)航一般是2~5個。這樣的排版是比較美觀的,那么為什么要這樣設(shè)計,這些輪播圖、快捷按鈕等小程序組件都有什么用呢?接下來就帶你詳細(xì)了解下
    2022-12-12
  • 微信小程序排坑指南詳解

    微信小程序排坑指南詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序排坑指南,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論

陵川县| 阳曲县| 祁门县| 涿鹿县| 来宾市| 电白县| 长岛县| 元谋县| 昌邑市| 延庆县| 竹山县| 商城县| 河池市| 紫金县| 三台县| 屏山县| 石棉县| 娄底市| 南川市| 丹江口市| 旬邑县| 元氏县| 丰原市| 巴青县| 昌宁县| 开阳县| 汕头市| 赤城县| 筠连县| 锡林浩特市| 临海市| 依兰县| 高陵县| 双流县| 上犹县| 辽中县| 山阴县| 忻城县| 佛教| 江都市| 玛多县|