2012-02-29 51 views
8

這很可能只是我的一個沮喪的語法錯誤。但resizeTime只是不清楚。無論多次使用clearInterval,計時器都會繼續運行。任何想法的人?我已經張貼了我真正的代碼:clearInterval無法正常工作

var resizeTime; // declared outside of wrapper function to INSURE no second declaration will occur 
    var myTransitionEvent = whichTransitionEvent(); 

    $(window).bind('adapt', function(){ 
     console.log('start', resizeTime); 
     resizeTime = setInterval(function(){ 
       console.log('go', resizeTime); 
       methods.relayoutChildren.apply(self); 
     }, 5); 
     setTimeout(function(){ 
     console.log('sNend', resizeTime); 
       clearInterval(resizeTime); 
     },1000); 

    }); 

    $('#allies-wrap').bind(myTransitionEvent, function(){ 
     console.log('end', resizeTime); 
     clearInterval(resizeTime); 
     methods.relayoutChildren.apply(self); 
    }); 

下面是鍍鉻的樣本數:

start undefined 
    start 8215 
    (10) go 8218 
    start 8218 
    start 8221 
    (256) go 8224 
    (2) sNend 8224 
    (9) go 8224 
    sNend 8224 
    (3) go 8224 
    sNend 8224 
    (2596) go 8224 

對於那些誰不知道Chrome的記錄,(2596)指2596次出現相同的日誌。

+0

你有什麼錯誤嗎? – 2012-02-29 15:28:00

+0

沒有錯誤,從我的IDE或瀏覽器;除了在日誌中「走」千次之外。 – Fresheyeball 2012-02-29 15:29:01

+0

我們是否可以有更詳細的運行計時器的代碼示例(在'adapt'綁定中的代碼正在完美地開始並清除間隔http://jsfiddle.net/vHn9r/) – 2012-02-29 15:29:55

回答

7

我認爲Transition事件沒有被觸發,但adapt事件被一次又一次地觸發。因此resizeTime在活動人員被清除之前發生變化。 您可以通過在設置新間隔之前清除間隔來修復它(至少使它變得更好)。

clearInterval(resizeTime); 
resizeTime = setInterval(function(){ 
        console.log('go', resizeTime); 
        methods.relayoutChildren.apply(self); 
      }, 5); 

clearTimeout(sNendTime); 
sNendTime = setTimeout(function(){ 
       console.log('sNend', resizeTime); 
       clearInterval(resizeTime); 
     },1000); 

編輯:

會發生什麼事是

  1. adapt事件觸發
  2. 一個新的間隔設置並分配到resizeTime
  3. 一個新的超時設置間隔ID
  4. 所以現在有兩件事是活躍的 - 一個間隔,一個超時
  5. 超時延遲經過之前,再次adapt事件觸發
  6. 一個新的間隔設置並分配到resizeTime
  7. 作爲resizeTime間隔ID被覆蓋的ID之前的間隔丟失,但該區間仍然活躍
  8. 一個新的超時設置
  9. 所以現在的4件事活躍 - 2個間隔2個超時
  10. 它繼續
  11. 1000後,說有20個間隔,20個超時活躍
  12. 第一次走出調用函數,它會清除由resizeTime
  13. 20值指出間隔靜得19個間隔19個超時活躍
  14. 它繼續
  15. 即使transitionevent觸發它只會清除最新間隔

爲您的代碼的工作應該有一個transitionevent後各adapt事件,但沒有。因此,我們必須清除活動時間間隔和活動超時時間,以便每次只有一個活動時間處於活動狀態,並且當超時結束時,該功能也會清除時間間隔。

+0

先生,你是一個學者和聖人。這工作完美,但我仍然不明白爲什麼。該變量只被聲明一次,那麼如何將其重複設置爲一個間隔會導致此問題?它不應該只是重置自己?一個變量可以有多個間隔嗎? – Fresheyeball 2012-02-29 20:56:44

+0

:)。不,它不會自行重置,並且一次只能指向一個。看到編輯,我已經解釋過了。謝謝。 – Diode 2012-03-01 05:42:25

+0

現在很酷。謝謝你的優秀回答,我剛剛學到了一些關於js的新東西! – Fresheyeball 2012-03-02 01:28:49