2012-02-19 32 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