我意识到滚动事件中的 javascript 有点奇怪。
直到现在,我一直坚信只要滚动位置发生变化,它就会直接触发。
而且因为 javascript 是阻塞的,所以回调总是第一个被执行的东西,也是第一个“看到”这个新值的函数——至少我是这么认为的。
在这里,我进行了简单的设置,其中全局值在滚动时更新为当前滚动位置。然后有一个区间比较两者。
现在,如果您快速滚动,有时确实会发生,缓存值与实际返回的滚动位置不同。
// cache scroll pos
var scrollPos = 0;
// update on scroll
window.onscroll = function () {
scrollPos = scrollTop();
};
// compare on interval
setInterval(function () {
if (scrollPos != scrollTop()) {
console.log("Out of sync! cached:", scrollPos, "| actual:", scrollTop());
}
}, 100);
小提琴: http: //jsfiddle.net/71vdx4rv/2/
您可以尝试快速滚动或使用按钮。[在 Chrome、Safari、FF、Opera 上测试]
为什么在回调之前执行间隔函数并知道“新”滚动位置?
有人可以向我解释一下吗?