2012-05-29 47 views
0

我有setTimeout的問題。不準確的setTimeout,它只適用於mousedown

在所有主流瀏覽器中,它工作正常,但不在IE中... 我正在創建一個Facebook應用程序謎題。當玩家按下開始按鈕時,計時器開始計算他玩一場遊戲的時間。 開始時我使用setInterval來增加計時器,但與Facebook腳本的合作在遊戲結束時延遲了大約2秒。然後我發現在計算器技巧提高計時器的準確性:setInterval timing slowly drifts away from staying accurate 並再次 - 沒有臉書它工作正常,沒有延遲顯示。有了Facebook,它仍然有延誤。 現在凝析可能會讓你感興趣的信息你: 當用戶點擊開始,然後我創建新的日期作爲startTime。 當用戶結束遊戲腳本時創建finalTime新日期,然後減去finalTime - startTime。

在代碼存在的setTimeout:

(...)  

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()); 
    } 

(...)  

當在正確的位置處的用戶最後拼圖然後調用clearTimeout(puzzle.to);

我現在有2個問題:

  1. 不準確的時間,在IE瀏覽器也可以是連得7第二個區別!/

要拖動的困惑我使用jQuery拖&降插件:

在IE
  • 比賽期間,當用戶有鼠標按下...它才起作用。 至少非常有用的信息將是如何實現準確的計時器。

  • +0

    您可以使用jQuery onReady來設置您的開始時間,並且每運行一個計時器(例如)0.5秒來運行一個計時器以輪詢開始時間和當前時間之間的差異。如果您在腳本中設置了內聯開始時間,則無法保證其執行時間,特別是在使用多個JS SDK時。 –

    +0

    @Connor感謝您的回覆:)'您可以使用jQuery onReady'您是否應該將腳本放在$(document).ready(function(){...})中; ?我的所有腳本(JS SDK除外)都位於頁面的底部,因此它們在所有DOM元素之後加載,但我不確定是否理解您正確。你建議每0.5秒運行計時器,就像你在代碼中看到的那樣,我每100ms運行一次計時器來計算它,所以我認爲它更好。有什麼辦法可以「切斷」這個定時器,這樣它就不會干擾FB JS SDK和我的拖放操作?或者有什麼更好的方法來實現我想要的,我不知道? – Rob

    +0

    jQuery部分是正確的。根據上面增加的信息,我會添加其餘的作爲可能的答案。 –

    回答

    0

    您應該將腳本放在jQuery的ready函數中,而不是放在頁面底部,因爲Facebook SDK是異步加載的,並且如果它們是在頁面底部啓動的,可能會影響定時執行。

    至於時間,你會看到在IE7 15ms和45ms之間的不準確性,取決於頁面上的其他JS執行。你的100ms超時會因此而漂移很大。最好記錄一個開始時間,並建立一個比所需輪詢頻率更高的計時器,並在每個週期的開始時間和'now'之間進行比較,以確定下一步要做什麼。

    +1

    太好了,謝謝你的幫助!我不知道這個事實,儘管我有腳本在底部,但它可能無法像我期望的那樣運行,就像你說的那樣。我也修改了我的計時器功能,就像你說的。現在,如果腳本滯後並且定時器在一段時間內沒有更改數字,則在'unlag'數字顯示正確的數字之後,不僅僅是+1秒。這是很容易的解決方案,因爲我現在可以看到:)再次感謝您的幫助!注意:我注意到,實際上它並不是FB JS引起的減速,它是拖放插件。 – Rob

    +0

    好東西,很高興聽到它適合你:) –

    相關問題