2011-09-25 46 views
0

在Javascript中,我想創建一個鼠標點擊處理程序。然後,我希望能夠在運行下一行代碼之前「忙等待」幾秒鐘*但在「忙等待」中,我仍然能夠處理鼠標單擊事件。'onmousedown'未被JavaScript調用

爲什麼下面的代碼會完全運行while循環,然後激活處理程序? (如,爲什麼不鼠標點擊事件處理程序不斷得到所謂的中間忙碌等待while循環?)

<html> 
    <body> 
     <p id="debugMessageElement"> </p> 

     <script type="text/javascript"> 
      canvas=document.createElement("canvas") 
      var ctx = canvas.getContext("2d"); 
      canvas.width = 840; 
      canvas.height = 560; 
      document.body.appendChild(canvas); 

      var mouse_input = function(event){ 
       document.getElementById("debugMessageElement").innerHTML = event.pageX + ", " + event.pageY + "<br />" 
      } 

      canvas.onmousedown = mouse_input; 

      timeallowed = 3 
      start = Date.now() 
      while(true){ 
       now = Date.now() 
       delta = now - start 
       if(delta >= timeallowed*1000){ 
        document.write("" + timeallowed + " seconds has passed") 
        break; 
       } 
      } 
     </script> 
    </body> 
</html> 

*是我設計就像上面我的代碼的原因是最終因爲我想這樣做:

for(p in person){ 
    for(t in person[p].shirts){ 
     busy_wait_5_seconds() //However, I want to process mouse clicks in these five seconds. 
     //THEN move on to the next shirt... After five seconds... 
    } 
} 

PS如果您要測試此代碼,請注意我使用了HTML5畫布,因此某些瀏覽器可能無法工作?

+1

你錯過了分號,特別是在你的'debugMessageElement'行。可能會造成問題.. –

+0

抱歉。 Javascript實際上並不關心分號,所以不幸的是這不是問題(我希望它很簡單!)。我習慣於Ruby和Python,所以我不使用分號。但謝謝你的提示。我正在慢慢轉換到JS –

+1

JavaScript是否關心分號碼,但一些瀏覽器不會,他們會自行決定插入缺少的分號碼。我強烈建議你堅持規範並明確使用分號。 –

回答

1

JavaScript只有一個線程。如果你做一個while-true循環,它將基本上凍結整個頁面,直到代碼停止運行。

要在執行某些代碼之前等待一段時間,應該使用setTimeout。你的問題的最終解決方案比這更復雜一點 - 你需要一個遞歸setTimeout來處理循環。

編輯:這裏是我快速鞭打的東西,它應該可以解決你在子循環中等待你的嵌套循環:http://jsfiddle.net/t4gsR/ - 如果你仍然是初學者,它可能會有點過頭,但按「運行」頂部菜單,看看它的工作:)

+0

我看着setTimeout和setInterval,但是,我不確定如何正確應用它。我可以做一個遞歸setTimeout,但不會搞砸嵌套for循環? –

+0

這個。當我看到一個標籤爲「javascript」和「multithreading」的問題時,有什麼是非常錯誤的。 – sethobrien

+0

是啊...我知道,JavaScript不是多線程的,所以我想學習實現問題 –