Javascript 高效地侦听JS.scroll()
我有一个带有许多子元素的可滚动元素和一个带有相应选项的select标记 我想根据元素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).
.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函数正是我想要的,也是我自己解决这个问题的方法中缺少的一部分,巧合的是,它与您的答案非常相似。