2012-02-19 30 views
5

我有一個可滾動的元素,其中包含許多子元素和一個帶有相應選項的選擇標籤。有效地收聽JS .scroll()

我想改變基於元素.scrollTop()

如何有效地做到這一點選擇的價值?我想過將兒童的.offset().top存儲在一個數組中,並循環遍歷它。但是,瀏覽器不處理它。我可能會嘗試創建一個.setTimeout()標誌,但這看起來並不乾淨。

r = $('ul') 
    offsets = [] 
    r.find('li').each((index) -> 
     offsets[index] = $(this).offset().top 
    ) 
    r.bind('scroll', -> 
     // while loop checking .scrollTop() > offsets[n] is slow 
     // maybe spams to many .scroll events? 
    ) 

回答

9

@osoner說的+而不是在滾動偶處理程序中進行所有計算,在間隔後觸發處理程序中的另一個事件(例如,'fooscroll'),然後您將所有子元素訂閱到事件,並根據您設置的條件自行更新。

var scrollTimer; 
$(window).on('scroll', function(e) { 
    if (scrollTimer) { clearTimeout(scrollTimer); } 
    scrollTimer = setTimeout(function() { 
     $(window).trigger('fooscroll'); 
    }, 200); 
}); 

$('li').on('fooscroll', function() { 
    // Check scrollTop or whatever... 
}); 
+0

我更喜歡這個(討厭'setInterval')。謝謝! – mreq 2012-02-20 07:58:53

+0

我看到它正確的事件「fooscroll」只會被解僱,如果用戶停止滾動200ms? – Simon 2012-09-10 13:00:18

+0

@Simon:是的,你是對的。爲了澄清,不,它不'節流'滾動。如果你想每200毫秒滾動滾動一次,而不是隻有一次用戶滾動滾動,你必須以不同的方式進行滾動。 – hayavuk 2012-09-11 14:28:47