2012-08-23 78 views
-1

我一直在爲未來的項目編寫代碼庫。我一直在研究的功能之一是暫停功能。到目前爲止,對於報告腳本運行時間長達10秒的錯誤,我沒有任何問題。這主要是讓惡意用戶忙碌,這在你設置很長時間時效果很好。我想知道是否有任何我應該注意的錯誤,我可能會面對? 下面的代碼...暫停所有javascript

pause = function(a) { 
    var b = new Date().getTime(); 
    e = false; 
    function wait() { 
    d=10; 
    for(i=0;i<d;i++) { 
     d++; 
     var c = new Date().getTime(); 
     if(c-b>=a) { 
      e = true; 
      break; 
     } 
     if(d>1000000) { 
      break; 
     } 
    } 
} 
wait(); 
if(e==false) { 
    pause(a-(new Date().getTime()-b)); 
}}; 
+2

Eeeck。如果我遇到過這樣的網頁,我永遠不會回到那個網站。這是可怕的行爲。瀏覽器試圖阻止它的原因。 – jfriend00

+0

這也是不良代碼,未聲明的隱式全局變量和循環以及不需要的測試。 – jfriend00

+0

這個函數更多地被用作惡意用戶的防禦機制,你可以想象當它被設置爲1000000時會發生什麼。雖然沒有人真的回答了這個問題,但是無論如何,謝謝。 – FrameDev

回答

4

你永遠永遠想要做這樣的事情在Javascript。正如您已經注意到的那樣,瀏覽器會抱怨您的腳本耗時過長。此外,這將花費比必要更多的能量,這對於電池容量有限的移動設備很重要。

取而代之,使用標準setTimeout()函數稍後運行代碼。

+0

我明白,但那不是我要求的。 – FrameDev

+1

@FrameDev - 那你在問什麼?我們告訴你不要做你正在做的事情,因爲它絕不是在JavaScript中做的正確的事情。 – jfriend00

0

JavaScript已經有辦法做到這一點。使用setTimeout()並在繼續操作時將匿名函數傳遞給它。第二個參數是以毫秒爲單位的延遲。

實施例:

的setTimeout(函數(){警報( '你好');},2000);

0

正如我到目前爲止在我的評論中所說的,嘗試在JavaScript中運行半無限循環從來就不是一個好主意。

這裏有一些問題要注意:

  1. 如果不通過一段時間後,完成你的執行的JavaScript線程返回到瀏覽器事件循環,瀏覽器將停止,提示用戶在該瀏覽器窗口中殺死JavaScript。
  2. 你的代碼使用了一堆未聲明的變量,這使得它們隱含的全局變量。由於它們具有通用名稱,因此它們可能很容易干擾其他代碼。
  3. 由於JavaScript是單線程的,當您的循環運行時,該窗口的其他任何瀏覽器事件都無法運行,導致瀏覽器窗口基本凍結。用戶會認爲它是掛起的。患者用戶可能會等待更長時間才能看到它是否完成。不耐煩的用戶會殺死瀏覽器窗口。

基本上你要做的是在用戶的瀏覽器上發起拒絕服務攻擊。你可能不喜歡他們在你的網頁上做什麼,但攻擊他們似乎不合適。更好地阻止以適合瀏覽器的方式訪問您的頁面,而不是採用瀏覽器攻擊的方式。

建議:

如果你真正想要做的就是使您的網頁無用在某些情況下(你還沒有解釋爲什麼你想這樣做或什麼條件觸發你的願望,做到這一點),那麼在沒有試圖殺死瀏覽器的情況下使頁面變得無用或者信息化可能會更好。你可以這樣做:

  1. 只是隱藏在DOM中的所有內容,使窗口變爲空白。
  2. 刪除所有DOM元素,使窗口變爲空白。
  3. 在整個窗口上放置一個透明層,以便沒有輸入事件可以到達頁面元素,但視覺效果停留在那裏。您可以將消息添加到該窗口。
  4. 用適當的信息替換頁面的內容。