欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 在各個(gè)瀏覽器中執(zhí)行的耐性

 更新時(shí)間:2009年04月06日 00:48:08   作者:  
經(jīng)常會(huì)遇到這樣一個(gè)情況:瀏覽器彈出對(duì)話框,提示腳本運(yùn)行時(shí)間過(guò)長(zhǎng),詢問(wèn)“停止”還是“繼續(xù)”。那究竟各個(gè)瀏覽器是如何判斷在什么時(shí)候才彈出此對(duì)話框呢?
IE:執(zhí)行超過(guò)500W條JScript引擎語(yǔ)句出現(xiàn)提示。
Firefox:執(zhí)行超過(guò)10秒出現(xiàn)提示。
Safari:執(zhí)行超過(guò)5秒出現(xiàn)提示。
Opera:無(wú)論執(zhí)行多久都不會(huì)出現(xiàn)提示,最有耐性。
Chrome:執(zhí)行超過(guò)約8秒(估計(jì)值)出現(xiàn)提示。
注:當(dāng)彈出類似alert的模式對(duì)話框的時(shí)候,是不計(jì)時(shí)。

Web開(kāi)發(fā)的時(shí)候,經(jīng)常會(huì)遇到的一種情況就是瀏覽器提示腳本運(yùn)行時(shí)間過(guò)長(zhǎng),停止還是繼續(xù),無(wú)論你選擇什么,相信你都會(huì)想盡一切辦法讓這個(gè)對(duì)話框遠(yuǎn)離你的用戶們??赡闶欠裰溃@些不同的瀏覽器究竟是如何判斷,哪些腳本處于“失控”狀態(tài)么?本文作者,就從Internet Explorer、Firefox、Safari、Chrome和Opera五種瀏覽器,分析了這個(gè)情況出現(xiàn)的原因。

【原文標(biāo)題】What determines that a script is long-running?
【原文作者】Nicholas C. Zakas

以下是對(duì)原文的翻譯:

Web開(kāi)發(fā)者經(jīng)常遇到并必須及時(shí)處理的問(wèn)題就是“提示腳本運(yùn)行時(shí)間過(guò)長(zhǎng)的提示框”(或者稱為“失控腳本提示”),這些令人討厭的對(duì)話框會(huì)在你的腳本 執(zhí)行時(shí)間過(guò)長(zhǎng)的時(shí)候出現(xiàn)。對(duì)于Web開(kāi)發(fā)者的基本準(zhǔn)則就是,無(wú)論什么時(shí)候,都不要讓用戶看到這些對(duì)話框,因?yàn)檫@會(huì)給人一種代碼缺乏結(jié)構(gòu)化的印象,更簡(jiǎn)單的 說(shuō),你的代碼負(fù)擔(dān)太重了。

用Brendan Eich(JavaScript的發(fā)明人)的話來(lái)講,如果JavaScript運(yùn)行的時(shí)間需要用秒來(lái)計(jì)算,一定是什么地方搞錯(cuò)了。我個(gè)人可以忍受的上限可 能更小一些,不論什么腳本,在任何時(shí)間、任何瀏覽器上執(zhí)行,都不應(yīng)該超過(guò)100毫秒。如果實(shí)際執(zhí)行的時(shí)間長(zhǎng)于這個(gè)底限,一定要將進(jìn)程分解成若干更小的代碼 段。

另外,其實(shí)很少有人真正意識(shí)到究竟是什么原因?qū)е履_本在不同的瀏覽器中運(yùn)行時(shí)間過(guò)長(zhǎng),連我自己都沒(méi)有深究過(guò)。所以我決定坐下來(lái)好好研究一下,我們究 竟會(huì)在什么情況才會(huì)看到那個(gè)討厭的對(duì)話框。判斷腳本是否失控,無(wú)外乎就兩種方法。一種是根據(jù)執(zhí)行了多少條語(yǔ)句,一種是判斷腳本執(zhí)行花費(fèi)的時(shí)間。各個(gè)瀏覽器 判斷腳本失控的具體方法會(huì)有略微的不同。

Internet Explorer

Internet Explorer判斷一個(gè)腳本是否失控,主要通過(guò)JScript引擎執(zhí)行語(yǔ)句的總數(shù)來(lái)判斷。默認(rèn)情況下,這個(gè)上限是500萬(wàn)條語(yǔ)句,這個(gè)值是可以通過(guò)注冊(cè)表修改的。當(dāng)你的腳本執(zhí)行的語(yǔ)句數(shù)量超過(guò)這個(gè)限制,你就會(huì)看到下面的窗口。

IE Dialog: A script on this page is causing Internet Explorer to run slowly. If it continues to run, your compute may become unresponsive.

這個(gè)對(duì)話框提示:“這個(gè)頁(yè)面上有一段腳本導(dǎo)致Internet Explorer運(yùn)行緩慢,如果你繼續(xù)運(yùn)行,你的計(jì)算機(jī)可能會(huì)變?yōu)闊o(wú)響應(yīng)狀態(tài)”。要不是追求技術(shù)上的準(zhǔn)確性,這樣說(shuō)確實(shí)有點(diǎn)過(guò)了。對(duì)話框有兩個(gè)選項(xiàng),要么 停止腳本執(zhí)行,要么允許腳本繼續(xù)運(yùn)行。當(dāng)這個(gè)對(duì)話框顯示的時(shí)候,腳本已經(jīng)被完全停止了。如果你選擇繼續(xù)運(yùn)行腳本,就會(huì)重新計(jì)算當(dāng)前執(zhí)行的語(yǔ)句數(shù),也就是 說(shuō),如果這個(gè)數(shù)值再次達(dá)到上限時(shí),你會(huì)再次看到這個(gè)對(duì)話框。

Firefox

Firefox是根據(jù)腳本引擎持續(xù)執(zhí)行代碼的時(shí)間來(lái)判斷一段腳本是否失控。默認(rèn)的上限是10秒,可以通過(guò)about:config頁(yè)面來(lái)修改這個(gè)值。這里需要注意的是,當(dāng)彈出類似alert的模式對(duì)話框的時(shí)候,是不計(jì)時(shí)的。當(dāng)瀏覽器執(zhí)行腳本的時(shí)間達(dá)到這個(gè)上限,F(xiàn)irefox就會(huì)顯示類似下面的對(duì)話框:

Firefox Dialog: A script on this page may be busy, or it may have stopped responding. You can stop the script now, open the script in the debugger, or let the script continue.

Firefox的對(duì)話框提示:“這個(gè)頁(yè)面的一段腳本目前運(yùn)行忙,或者這段腳本已經(jīng)停止響應(yīng)。你可以停止執(zhí)行這段腳本,并在調(diào)試器中打開(kāi)這段腳本,或 者保持這段腳本繼續(xù)運(yùn)行”。更清楚的描述了遇到的問(wèn)題,并且沒(méi)有IE說(shuō)的那么恐怖。在這個(gè)對(duì)話框上可以執(zhí)行三種操作:停止腳本執(zhí)行、調(diào)試腳本或者讓腳本繼 續(xù)運(yùn)行。和Internet Explorer一樣,當(dāng)運(yùn)行腳本繼續(xù)運(yùn)行以后,對(duì)持續(xù)運(yùn)行腳本時(shí)間的統(tǒng)計(jì)就會(huì)重置。調(diào)試腳本按鈕,只有在你安裝了Firebug,并在該頁(yè)面激活了調(diào)試 的時(shí)候才會(huì)出現(xiàn)。執(zhí)行調(diào)試腳本操作后,可以顯示執(zhí)行時(shí)間過(guò)長(zhǎng)的代碼段的具體位置。

Safari

Safari同樣根據(jù)腳本引擎持續(xù)執(zhí)行腳本的時(shí)間來(lái)判斷,當(dāng)我對(duì)Webkit的源代碼進(jìn)行反復(fù)研究后,發(fā)現(xiàn)默認(rèn)的超時(shí)時(shí)間是5秒,一旦達(dá)到這個(gè)上限,就會(huì)給出下面的對(duì)話框提示:

Safari Dialog: A script on the page [url] is making Safari unresponsive. Do you want to continue running the script, or stop it?

對(duì)話框提示:“在頁(yè)面url上的腳本讓Safari失去響應(yīng),你是要繼續(xù)運(yùn)行腳本還是終止腳本”。同樣的,對(duì)于用戶來(lái)說(shuō),也不是什么可怕的提示。在Safari中,可以關(guān)閉失控腳本的檢測(cè)功能

Chrome

Chrome在跟蹤技術(shù)上有點(diǎn)狡猾,失控腳本檢測(cè)功能似乎和tab的事故控制(crash control)關(guān)聯(lián)到一起。我仔細(xì)看了源代碼,卻沒(méi)有找到具體的限制,但基本確定的是,這個(gè)限制是以時(shí)間為基礎(chǔ)的,估計(jì)在10秒左右(要么是5秒,要么 是10秒,總要和Safari或者Firefox看齊么)。我正在聯(lián)系Chrome項(xiàng)目組中的朋友,看看能不能得到確定的信息。盡管如此,如果網(wǎng)頁(yè)中存在 失控的腳本,用戶還是會(huì)看到下面的對(duì)話框:

Chrome Dialog: The following page(s) have become unresponsive. You can wait for them to become responsive or kill them.

毫無(wú)疑問(wèn),Chrome的提示比起其他瀏覽器來(lái)說(shuō),顯得都更加嚴(yán)重。點(diǎn)擊“Wait”按鈕,腳本會(huì)繼續(xù)運(yùn)行,直到達(dá)到下一個(gè)上限為止,也可以點(diǎn)擊“Kill pages”,直接關(guān)閉該頁(yè)面在內(nèi)存中的所有信息,并用一個(gè)空白頁(yè)取而代之。

Opera

Opera的情況比較有趣:他貌似沒(méi)有針對(duì)失控腳本的相應(yīng)限制。我運(yùn)行了幾個(gè)很長(zhǎng)的測(cè)試,甚至花了幾分鐘,而在這個(gè)過(guò)程中,瀏覽器一直可以正常響應(yīng),這很出我的意料之外。我不是很確定,對(duì)于現(xiàn)在的情況來(lái)說(shuō),這個(gè)方法是好是壞,但至少它生效了,不是么?

一些建議

無(wú)論你的用戶使用什么瀏覽器,都不應(yīng)該在任何時(shí)候看到類似的提示。在你的網(wǎng)站或者Web應(yīng)用程序作為產(chǎn)品發(fā)布之前,做一些常規(guī)的性能測(cè)試是非常有必要的。在這方面有很多工具可以加以利用,比如Firebug's profiler(只支持Firefox)、YUI Profiler (支持全部瀏覽器)或者Internet Explorer 8's Profiler。 你應(yīng)該毫不猶豫地將那些執(zhí)行時(shí)間超過(guò)100毫秒的腳本找出來(lái),哪怕這些腳本只是在某些瀏覽器上運(yùn)行不暢,這些腳本包含了一些需要執(zhí)行很長(zhǎng)時(shí)間的代碼段,而 這些代碼應(yīng)該通過(guò)性能檢測(cè)工具進(jìn)行重新評(píng)估。確保你不是使用Chrome作為測(cè)試的底線,因?yàn)镃hrome在執(zhí)行JavaScript的速度上比其他瀏覽 器要高出一個(gè)數(shù)量級(jí)(和Firefox 3.1還有最新的WebKit Nightly相當(dāng))。最好使用Internet Explorer作為測(cè)試的底線,然后再測(cè)試其他瀏覽器,因?yàn)闊o(wú)論什么時(shí)候,IE的JavaScript引擎都是最慢的,當(dāng)在IE上修復(fù)問(wèn)題以后,十有八 九在其他瀏覽器上也可以正常運(yùn)行了。

相關(guān)文章

  • 微信小程序?qū)W習(xí)筆記之本地?cái)?shù)據(jù)緩存功能詳解

    微信小程序?qū)W習(xí)筆記之本地?cái)?shù)據(jù)緩存功能詳解

    這篇文章主要介紹了微信小程序?qū)W習(xí)筆記之本地?cái)?shù)據(jù)緩存功能,結(jié)合實(shí)例形式分析了微信小程序wx.setStorage、wx.getStorage以及wx.removeStorage、wx.clearStorage針對(duì)數(shù)據(jù)緩存的存取、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • JS獲取當(dāng)前地理位置的方法

    JS獲取當(dāng)前地理位置的方法

    這篇文章主要為大家詳細(xì)介紹了JS獲取當(dāng)前地理位置的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • echarts餅圖扇區(qū)添加點(diǎn)擊事件的實(shí)例

    echarts餅圖扇區(qū)添加點(diǎn)擊事件的實(shí)例

    下面小編就為大家?guī)?lái)一篇echarts餅圖扇區(qū)添加點(diǎn)擊事件的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Echarts圖表如何利用formatter自定義tooltip的內(nèi)容和樣式

    Echarts圖表如何利用formatter自定義tooltip的內(nèi)容和樣式

    這篇文章主要給大家介紹了關(guān)于Echarts圖表如何利用formatter自定義tooltip的內(nèi)容和樣式的相關(guān)資料,echarts的圖表配置非常的靈活自由,但是不熟悉的時(shí)候容易不知道怎么配置,需要的朋友可以參考下
    2023-06-06
  • Express框架Router?Route?Layer對(duì)象使用示例詳解

    Express框架Router?Route?Layer對(duì)象使用示例詳解

    這篇文章主要為大家介紹了Express框架Router?Route?Layer對(duì)象使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • js css+html實(shí)現(xiàn)簡(jiǎn)單的日歷

    js css+html實(shí)現(xiàn)簡(jiǎn)單的日歷

    這篇文章主要為大家詳細(xì)介紹了由html、css、javascript結(jié)合實(shí)現(xiàn)的簡(jiǎn)單日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 最新評(píng)論