在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ì)看到下面的窗口。
這個(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的對(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)的代碼段的具體位置。
出處:七月佑安
責(zé)任編輯:bluehearts
上一頁(yè) 下一頁(yè) 瀏覽器根據(jù)什么來(lái)判定腳本失控? [2]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|