Javascript 高效地侦听JS.scroll()

Javascript 高效地侦听JS.scroll(),javascript,jquery,coffeescript,Javascript,Jquery,Coffeescript,我有一个带有许多子元素的可滚动元素和一个带有相应选项的select标记 我想根据元素.scrollTop() 如何有效地做到这一点?我想把孩子们的.offset().top存储在一个数组中,然后循环遍历它。但是,浏览器无法处理它。我可能会尝试创建一个.setTimeout()标志,但这似乎并不干净 r = $('ul') offsets = [] r.find('li').each((index) -> offsets[index] = $(this).

我有一个带有许多子元素的可滚动元素和一个带有相应选项的select标记

我想根据元素
.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?
    )

你应该读书。基本上,每次用户滚动时都会设置一个标志,并使用检查该标志的间隔函数执行所需的操作。

那么@osoner所说的是什么呢?+不是在滚动偶数处理程序中执行所有计算,而是在间隔后在处理程序中触发另一个事件(例如,“foosroll”),然后让所有子元素订阅事件,并根据设置的条件更新它们自己

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...
});

我更喜欢这个(hate
setInterval
)。谢谢我是否认为只有当用户停止滚动200毫秒时才会触发事件“fooscroll”?西蒙:是的,你是对的。澄清一下,不,它不会“限制”滚动。如果你想每200毫秒启动一次滚动,而不是只在用户完成滚动后启动一次,那么你必须以不同的方式进行。谢谢你,先生。clearTimeout函数正是我想要的,也是我自己解决这个问题的方法中缺少的一部分,巧合的是,它与您的答案非常相似。