2011-09-25 77 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不是多线程的,所以我想学习实现问题 –