2013-07-09 28 views
2

我有下面的JS代碼的Javascript clearInterval不清除

$('body').on({ 
    click: function() 
    { 
     var el = $(this); 
     lookUpTask(el); 

     el.bind('blur', function(){ 
      timeOutTask = setInterval(function(){ 
       if(timeOutTask) 
       { 
        clearInterval(timeOutTask); 
        el.trigger('remove_match'); 
       } 
      }, 500); 

      $('body').on({ 
       click: function(event) 
       { 
        var match = $(this); 
        var color = match.attr('color'); 

        // Check color to change brightness 
        var brightness = hexToLuminance(color); 
        var text_color = '#000'; 
        if(brightness < 128) { 
         text_color = '#fff'; 
        } 

        // Change color according to brightness 
        el.css('color',text_color); 
        el.parent().parent().children('.remove').css('color',text_color); 
        el.parent().parent().children('.resize').css('color',text_color); 

        // Change the background and task name 
        el.parent().parent().css('background-color', color); 
        el.val(match.html()); 

        // Update DB 


        // Remove the task_match 
        el.trigger('remove_match'); 
       } 
      },'.match'); 
     }); 

     el.bind('remove_match', function(){ 
      if(el.val == "") { 
       el.val('Select Task'); 
      } 
      el.css('text-align','center'); 
      el.parent().children('.match_results').remove(); 
      clearInterval(timeOutTask); 
     }); 
    }, 
    keyup: function(event) 
    { 
     lookUpTask($(this)); 
    } 
},'.task_select'); 

當用戶點擊.task_select,然後我調出匹配的結果,並在屏幕上顯示我所試圖做的是。現在,用戶可以選擇其中一個選項,或者在外面點擊。如果在外面,則匹配結果應該關閉。如果選擇了其中一個選項,則中間的整個代碼將運行。

問題是匹配的結果疊加在另一個div的頂部,如果它被點擊,則會發生其他情況。當我點擊匹配的結果時,然後代碼註冊爲點擊外部(所以匹配的選中消失,效果就好像我點擊了其他div,我不想點擊。

所以我的解決辦法是放在外面的點擊前一個計時器被執行。這一切工作正常,但clearInterval不clearout定時器!!所以我第二次加載的東西,它是彷彿計時器不會被清除!

爲什麼?

+1

您正在用新的時間間隔覆蓋'timeOutTask'。請參閱[這是我的回答](http://stackoverflow.com/a/17199864/1169519),如何緩存間隔。雖然答案是關於超時,但你也可以將它應用於間隔。 – Teemu

+0

太棒了!這工作像一個魅力!謝謝!如果你把它寫成答覆,那麼我可以將其標記爲解決方案 – user1083320

回答

2

你覆蓋timeOutTask一個新的時間間隔您可以緩存間隔一個數組,像這樣:

var timeOutTasks = []; 
$('body').on({ 
    ... 
    el.bind('blur', function(){ 
     timeOutTasks.push(setInterval(function(){ 
      clearInterval(timeOutTasks.pop()); 
         ... 
     }, 500); 
      ... 
    } 
      ... 
}