2013-11-24 37 views
1

所以我有一個滾動事件。它負責確定是否應該在頁面上移動某些內容。當您向下滾動時,它會熄滅。如果你向下滾動,拖動,它會發出幾百億次和幾百億次的火焰。正如你所期望的,也許。這裏有一些簡單的虛擬代碼來表示事件的順序。如何在jQuery中中斷以前的事件觸發器

function scroller() { 
    // 1. A really expensive calculation that depends on the scroll position 
    // 2. Another expensive calculation to work out where should be now 
    // 3. Stop current animations 
    // 4. Animate an object to new position based on 1 and 2 
} 
$(window).on('resize' scroller); 

不要誤會我的意思,它通常準確所以沒有那麼多的併發問題的。我的動畫裏面的事件調用.stop()(作爲第3部分),所以最新版本總是*正確的,但它消耗了大量的CPU。我希望成爲一名負責任的開發人員,不要期望每個用戶都擁有一個四核i7。

所以對我的問題... 我可以殺死以前調用我的方法從一個特定的事件處理程序?有什麼辦法可以干預這堆排隊/並行運行的「進程」,這樣當一個新的堆棧被添加到堆棧時,舊的堆棧會立即被終止?我確信有一種並行的方式來表達這種措辭,但我想不起來。

*至少我認爲是這樣的話 - 如果計算在前面的運行需要較長的時間,他們的動畫可以被稱爲最後一個,並可能向上翹起整個運行!嗯。在此之前我沒有想過這件事。另一個立即停止以前的迭代的原因!

+1

一個可能的解決方案是使用某種[反跳(http://underscorejs.org/#debounce)像等待200ms的像的時間看看是否有其他事件會被解僱 –

回答

2

您可以確保事件每x毫秒最多觸發一次。例如:

(function ($) { 
    $.fn.delayEvent = function (event, callback, ms) { 
     var whichjQuery = parseFloat($().jquery, 10) 
      , bindMethod = whichjQuery > 1.7 ? "on" : "bind" 
      , timer = 0; 
     $(this)[bindMethod](event, function (event) {     
      clearTimeout (timer); 
      timer = setTimeout($.proxy(callback, this, event), ms); 
     }); 
     return $(this); 
    }; 
})(jQuery); 

$(window).delayEvent("resize", scroller, 1000); 

簡約演示:http://jsfiddle.net/karim79/z2Qhz/6/

相關問題