2011-02-02 2 views
20

setTimeout을 향후 1 분 동안 설정하고 내 시스템 시간을 과거 5 분으로 변경하면 setTimeout 기능이 6 분 후에 트리거됩니다 .JavaScript setTimeout 및 시스템 시간 변경으로 인해 문제가 발생합니다.

시스템 시계에 일광 절약 시간이 변경되는 동안 어떤 일이 발생했는지 알고 싶기 때문에이 작업을 수행했습니다.

자바 스크립트 웹 페이지는 setTimeout 함수를 사용하여 5 초마다 페이지를 자동으로 새로 고침하고 일광 절약 시간이 발생하면 페이지 정보가 1 시간 동안 고정됩니다. 해결 방법이 있습니까?

편집 : Ajax를 사용하여 페이지를 업데이트 할 때 전체 페이지를 새로 고치지 않습니다.

+0

어떤 브라우저를 사용하고 있습니까? –

+8

일광 절약 시간제 변경이 발생하면 실제로는 시간대 오프셋 변경이며 UTC로 변경되지는 않습니다. 수행 한 테스트는 DST가 시스템에 의해 자동으로 처리되는 경우 실제로 발생하는 것을 모델링하지 않습니다. 그러나 컴퓨터 시계가 실시간에서 멀리 떨어지면 자동 시간 동기화와 마찬가지로 [도약 초] (http://en.wikipedia.org/wiki/Leap_second)는 여전히 문제를 일으킬 수 있습니다 (따라서 점차적으로 시간 변경). – PleaseStand

+0

필자는 IE7, IE8, IE9, Firefox 및 Windows 7의 Chrome에서이 기능을 테스트했지만 설명하는 동작이 표시되지 않습니다. 어쩌면 이것이 OS에만 해당되는 것일까? – gilly3

답변

4

내가 수행 할 작업은 5 초마다 새로운 Ajax 요청을 열지 않고 Comet (긴 폴링)을 사용하는 것으로 변경됩니다. 서버가 필요할 때마다 서버가 새 결과를 브라우저에 전송할 것이므로 서버 측에서 매 5 초마다 또는 새로운 정보를 사용할 때마다 더 나은 옵션입니다.

웹 소켓을 사용하고 Comet을 폴백으로 사용하는 것이 더 좋을 것입니다. Faye 또는 socket.oi으로 구현하기 쉽습니다.

CometD o Ape와 같은 다른 옵션이 있습니다.

+0

+1 웹 소켓 용. – Raynos

0

메타 태그를 새로 고침하여 사용할 수 있습니다. 이 코드는 페이지를 5 초마다 새로 고침 것 :

<meta http-equiv="refresh" content="5"> 

는 자바 스크립트 질문에 관해서는, 그냥 브라우저에서는 setTimeout을 처리하는 방법이 될 수 있습니다. 설정된 시간에 코드를 실행하도록 브라우저에 지시 한 다음 시계가 변경되면 시계가 변경되기 전에 코드가 여전히 실행됩니까? 그냥 추측하지만 다음에 setTimeout을 사용할 때 염두에 두어야 할 것입니다.

편집 : 좋아, 아약스에서는 작동하지 않습니다. 다시 편집 : 이것은 정말 좋은 질문입니다. 나는 위에서 말했듯이 setTimeout이 작동한다고 확신하지만 와우, 이것은 두뇌 티저이다.

+0

Ajax를 사용하여 페이지를 업데이트하고 새로 고칠 수 없다고 추가하는 질문을 편집했습니다. –

4

대신 사용 setTimeoutsetInterval하고 문제가 해결되어야한다 :

업데이트 : 당신이 정말로에서는 setTimeout이나 setInterval을 중 하나를 사용할 수없는 경우

것은, 간단한 HTML을로드 숨겨진 iframe을 시도 할 수 페이지는 다음과 같습니다.

<html> 
    <head> 
     <meta http-equiv="refresh" content="300"/> 
     <script> 
      document.domain='same as parent page'; 
      top.ajax_function_you_wish_to_trigger(); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

당신이 운이 좋으면 메타 새로 고침으로 인해 동일한 문제가 발생하지 않습니다.

또 다른 해결 방법은 server push을 통해 서버로 이벤트 실행을 이동하는 것입니다. 이렇게하지 않는 데에는 여러 가지 이유가 있습니다. 이벤트를 중앙 집중화하고 서버에 부담을 줄 수있는 것은 아니지만 최후의 수단으로 간주 될 수 있습니다.

+0

불행히도이 문제가 해결되지 않았습니다. 똑같은 일이 일어난다. –

+0

유감스럽게도 setInterval이 현저히 나 빠졌습니다. – Raynos

+0

그게 이상하네요 - 당신은 어떤 OS에요? 모든 브라우저에서 win7 64 비트의 setInterval을 사용하여이 문제를 재현 할 수 없습니다. –

0

if (Date in range foo) 수표를 퍼지하고 수행 할 수 있습니다. 기본적으로 현재 타임 스탬프가 일광 절약 시간의 5 초 내에 있는지 확인한 다음 setTimeout을 사용하여 즉시 페이지를 새로 고칩니다.

이렇게하면 사용자는 알려진 시간이 다가올 때마다 사소한 불편을 겪게되지만 페이지는 한 시간 동안 멈추지 않습니다.

1

최근에이 문제가 발생했습니다. 저의 경우 시간 변경은 심각한 재정적 손실을 초래할 수 있으므로 심각하게 받아 들여야했습니다.

일부 배경 :

  • IE와 오페라가 제대로 시스템 시간 변경을 처리 (의 setTimeout, setInterval을에 부작용).
  • FF < 4.0 그리고 모든 Webkit 기반 브라우저는 (이전과 똑같은) 과거의 시간 변경을 처리하지 못합니다. 참고 : Chrome의 타이머는 ~ 2-60 초 후에 만 ​​중단됩니다.

내 솔루션 : 사용자 상호 작용 (예 : mousemove, mouseove 등)의 일정을 사용하여 시간 변경 확인을 실행합니다.

Clock.prototype.checkLocalTime = function(){ 
var diff = Date.now()- this.lastTimestamp; 
if (diff < 0 || diff > 20000) { // if time shifted back or more than 20s to the future 
    console.warn('System time changed! By ' + diff + 'ms'); 
    this.restartTimer(); 
    this.getServerTime(); 
} 
this.lastTimestamp = time; 

}

당신은 내가 타이머를 다시 시작하고 추가로 서버와 시간을 동기화 알 수 있듯이.

관련 문제