为什么在事件回调之前执行间隔函数
Why is an interval function executed before an event callback?
我意识到javascript on scroll事件有些奇怪。
直到现在,我一直坚信,只要滚动位置发生变化,它就会被直接触发
因为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上测试]
为什么在回调之前执行interval函数并知道"新"滚动位置
有人能给我解释一下吗?
直到现在,我一直坚信,只要滚动位置发生变化,它就会被直接触发。
不幸的是(显然)情况并非如此。而DOM 3确实状态为
当文档视图或元素滚动时,用户代理必须调度[
scroll
]事件。此事件类型是在滚动发生后分派的
这并不意味着"立即"。CSSOM草案澄清:
[要执行滚动,请重复运行以下步骤]:
- 执行从
box
到position
的[平滑或即时]滚动- 对要运行
task
的任务进行排队,除非队列中有要运行task
的任务[其中
task
确实向相应目标发射scroll
事件]
"任务队列"明确表示事件是异步调度的,因此在滚动事件触发任务之前执行等待任务(如计时器)时,滚动位置可能已经更改。
此外,当执行平滑滚动时,在对任务进行排队以激发scroll
事件之前,允许浏览器在任意时间跨度内多次改变滚动位置。
相关文章:
- 如何做到这一点,使代码在不传递条件后执行函数
- javascript自执行函数-不同的语法
- JavaScript:只有当数组中的所有项都为true时才执行函数
- iFrame url更改时执行函数
- 为什么AngularJS在每个摘要循环上都执行函数
- 如何使用setInterval执行函数
- 当*ngFor以角度2结束时执行函数
- Ajax调用完成后如何执行函数
- 在显示引导弹出窗口之前执行函数
- 从自执行函数返回函数的Javascript性能命中率
- 在操作完成时执行函数
- jquery/js中的自执行函数
- 如何仅在完成对gap.client.youtube的请求.execute后执行函数
- 构造函数函数中的自执行函数的OO上下文/范围
- Javascript未使用=运算符执行函数
- AngularJS:如何按照预定义的顺序执行函数
- 在不使用隔离作用域的情况下执行函数的角度指令
- 如何在页面加载后执行函数是在 AngularJS 中完成的
- 完成页面加载后执行函数
- 如何在完成完全执行函数后触发循环