2011-09-25 4 views
0

자바 스크립트에서 마우스 클릭을위한 핸들러를 만들고 싶습니다. 그런 다음, 다음 코드 행을 실행하기 전에 몇 초 동안 "busy-wait"할 수 있기를 원합니다. * 그러나 "busy-wait"에서는 마우스 클릭 이벤트를 계속 처리 할 수 ​​있습니다.JavaScript에서 'onmousedown'이 호출되지 않습니다.

다음 코드는 왜 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는 실제로 세미콜론을 신경 쓰지 않으므로 불행히도 문제가되지 않습니다. (간단합니다.) 나는 루비와 파이썬에 익숙하므로 세미콜론을 사용하지 않는다. 하지만 팁 주셔서 감사합니다. 천천히 JS로 변환 중입니다 –

+1

Javascript는 세미콜론에 대해주의를 기울이지 만 일부 브라우저는 그렇지 않으므로 분실 된 세미콜론을 자신의 재량에 따라 삽입합니다. 필자는 사양을 고수하고 세미콜론을 명시 적으로 사용하는 것이 좋습니다. –

답변

1

JavaScript에는 스레드가 하나만 있습니다. true-while 루프를 수행하면 코드가 실행을 멈출 때까지 전체 페이지가 고정됩니다.

일부 코드를 실행하기 전에 특정 시간 동안 대기하려면 setTimeout을 사용해야합니다. 문제에 대한 최종 해결책은 루프를 처리하기 위해 재귀 적 setTimeout이 필요할 것입니다.

편집 : 여기에 내가 잠깐 기다려서 서브 루프에서 기다리는 중첩 된 루프를 해결해야하는 항목이 있습니다. http://jsfiddle.net/t4gsR/ - 아직 초보자인데도 "run"을 누르면 머리 위로 조금 갈 수 있습니다. 톱 메뉴와 그것이 작동 참조하십시오 :)

+0

setTimeout과 setInterval을 보았지만 정확하게 적용하는 방법이 확실하지 않았습니다. 재귀 setTimeout을 할 수는 있지만 중첩 된 for-loops를 망치지는 않습니까? –

+0

. "javascript"및 "multithreading"태그가 붙은 질문을 볼 때 무언가 잘못되었습니다. – sethobrien

+0

예 ... 알아요, 자바 스크립트는 멀티 스레드가 아니므로 문제를 구현하는 "자바 스크립트 방식"을 배우고 싶습니다. –

관련 문제