2012-05-29 5 views
0

setTimeout에 문제가 있습니다.정확하지 않은 setTimeout은 mousedown에서만 작동합니다.

모든 주요 브라우저에서 IE에서는 작동하지 않지만 잘 작동합니다. 저는 facebook app-puzzle을 만들고 있습니다. 플레이어가 Start (시작) 버튼을 누르면 타이머가 하나의 게임을 시작합니다. 처음에는 타이머를 늘리기 위해 setInterval을 사용했지만 페이스 북 스크립트의 협조로 게임이 끝나면 약 2 초가 지연되었습니다. 그럼 타이머의 정확성을 높이기 위해 stackoverflow 트릭을 발견 : setInterval timing slowly drifts away from staying accurate 그리고 다시 - 페이스 북없이 잘 작동, 지연 표시되지 않았다. 페이 스북 (Facebook)에서는 여전히 지연이 있습니다. 관심있는 정보가 응축됩니다. 사용자 : 사용자가 시작을 클릭하면 startTime으로 새로운 날짜를 만듭니다. 사용자가 게임 스크립트를 종료하면 finalTime new Date가 생성되고 finalTime - startTime이 생략됩니다. 코드에서

가에서는 setTimeout있다 :

마지막 퍼즐 조각 한 후 올바른 위치에 사용자 위치가 나는 사항 clearTimeout (puzzle.to)를 호출
(...)  

f : function() { 
     var sec_time = Math.floor((puzzle.nextAt - puzzle.startTime)/1000); 
     $('.timer').html(sec_time); 
     if (!puzzle.startTime) { 
      puzzle.startTime = new Date().getTime(); 
      puzzle.nextAt = puzzle.startTime; 
      $('.timer').html('0'); 
     } 
     puzzle.nextAt += 100; 
     puzzle.to = setTimeout(puzzle.f, puzzle.nextAt - new Date().getTime()); 
    } 

(...)  

;

  1. 하지 정확한 시간은, IE에서조차 칠초 차이가 될 수 있습니다

    는 지금이 문제가!/

가 나는 jQuery를 드래그 & 드롭 플러그인을 사용하여 퍼즐을 드래그 : 사용자가이 mousedown ... 때 게임 중

IE에서
  • 은에만 작동합니다. 적어도 아주 유용한 정보는 정확한 타이머를 달성하는 방법이 될 것입니다.

    +0

    jQuery onReady를 사용하여 시작 시간을 설정하고 타이머를 실행하기 위해 0.5 초마다 타이머를 실행하여 시작 시간과 현재 시간의 차이를 폴링 할 수 있습니다. 스크립트에서 시작 시간을 인라인으로 설정하면 실행 시간을 보장 할 수 없으며, 특히 여러 JS SDK를 사용할 때 보장 할 수 없습니다. –

    +0

    당신의 답장을 위해 @Connor 감사합니다 :) '당신은 jQuery onReady를 사용할 수 있습니다'당신은 $ (document) .ready (function() {...})에 스크립트를 넣어야한다는 것을 의미합니다; ? 페이지의 맨 아래에 모든 스크립트 (JS SDK 제외)가 있으므로 DOM 요소가 모두로드 된 후에로드되지만 사용자가 올바르게 이해하는지 확실하지 않습니다. 타이머를 100ms마다 실행하여 코드를 계산할 때 볼 수 있듯이 0.5 초마다 실행 타이머를 제안하면 훨씬 더 생각할 수 있습니다. FB JS SDK 및 드래그 앤 드롭 동작을 방해하지 않도록 타이머를 잘라내는 방법이 있습니까? 아니면 내가 원하는 것을 성취 할 수있는 더 좋은 방법이 있습니까, 모르겠습니다. – Rob

    +0

    jQuery 부분이 정확합니다. 위의 증가 된 정보를 바탕으로 나머지를 가능한 답으로 추가하겠습니다. –

    답변

    0

    페이 스북 SDK가 비동기 적으로로드되고 페이지 맨 아래에서 초기화 된 실행에 영향을 줄 수 있으므로 스크립트를 jQuery의 준비 기능에 넣고 페이지의 맨 아래에 두지 않아야합니다.

    타이밍에 관해서는 페이지의 다른 JS 실행에 따라 IE7에서 15ms에서 45ms 사이의 부정확도를 볼 수 있습니다. 이 때문에 100ms 제한 시간이 오래 걸릴 것입니다. 시작 시간을 기록하고 필요한 것보다 높은 폴링 빈도로 타이머를 작성하고 각 사이클에서 시작 시간과 '지금'을 비교하여 다음에 수행 할 작업을 결정하는 것이 좋습니다.

    +1

    도움을 주셔서 감사합니다. 나는 그 밑바닥에 대본을 가지고 있음에도 불구하고 당신이 말했듯이 내가 예상 한대로 달릴 수 없다는 사실에 대해 몰랐다. 나는 또한 타이머 기능을 수정했다. 이제 스크립트가 지연되고 타이머가 잠시 동안 숫자를 변경하지 않으면 '해제'숫자 뒤에 올바른 숫자가 표시되고 +1 초가 아닙니다.내가 지금 볼 수있는 아주 쉬운 해결책이다 :) 다시 도움을 청한다! 참고 : 사실 FB JS SDK가 속도 저하를 일으키는 것이 아니라는 사실을 알게 된 것은 드래그 앤 드롭 플러그인입니다. – Rob

    +0

    좋은 물건, 그것을 듣고 다행 당신을 위해 :) –

    관련 문제