2013-10-04 59 views
0

我正在試驗某些在鼠標關閉時連續執行某個功能的東西。我得到它無限循環,這正是我想要的,但我似乎無法停止該循環了。在mouseleave或mouseout上停止無限循環

我試着這樣做: -

$(document).on("mouseup mouseout",".someclass",function(){ loop(false) }); 

這需要假論據,並應停止循環。但循環會無限制地導致頁面崩潰。無論何時調用某個事件,我都希望無限循環停止,無論是mouseup,mouseout還是mouseleave。

我迄今爲止嘗試: - http://jsfiddle.net/ZQTvN/

要明白,這個會崩潰您的瀏覽器。

+1

您的最終目標是什麼?也許我們可以提出更好的建議 –

+0

我的目標是在事件正在發生時不斷觸發事件調用的函數(如按鍵,mousedown),並在事件結束後立即停止函數。 – shriek

+1

那麼,我的意思是這個函數會做什麼?就像 - 監視用戶花費在圖像上的遊歷時間等。但即使沒有細節,也許更好的辦法是在mouseenter上設置一個布爾值,或者在任何事件上設置布爾值,並讓循環函數以基於該布爾值的條件持續運行。所以'setInterval(function(){if(some_var){...}},500)'然後將some_var設置爲true,對相反事件設置false。 –

回答

2

您可以更改代碼,使用標誌和setTimeout的達到你想要的東西:

一個緊密的循環是這樣的(忙循環)將阻止從瀏覽器的任何輸入,所以它基本上是不能解析事件隊列,即。瀏覽器被鎖定。

通過實現setTimout來完成循環,您將允許瀏覽器對其他事件排隊,您需要檢測何時停止它。

如果每次實際上只會多次重新觸發它,則使用參數調用循環。當用虛假標誌調用時,該標誌將在該調用的本地,並且對其他已啓動的循環不做任何處理,因爲它們無法訪問該本地化標誌。

所以,一種方法是把標誌外(共同的旗幟,全球範圍):

MODIFIED FIDDLE HERE

例子:

var doLoop = false; 

function loopy() { 
    if (doLoop === true) { 
     setTimeout(function() { 
      console.log(doLoop); 
      loopy(); 
     }, 11); 
    } 

}; 
$(document).on("mousedown", ".classy", function() { 
    doLoop = true; 
    loopy(); 
}); 
$(document).on("mouseup mouseout", ".classy", function() { 
    doLoop = false; 
}); 

現在你可以看到循環運行而持有鼠標向下,並在發佈時停止等。