Javascript 在Jquery'中注册滚动事件时;s设置回调的动画,它有时会被触发

Javascript 在Jquery'中注册滚动事件时;s设置回调的动画,它有时会被触发,javascript,jquery,Javascript,Jquery,我创建了一个简单的示例。我有一个代码,在动画完成后将滚动事件注册到窗口,但您可以在控制台中看到滚动事件被触发了1-2次,我相信除非我真的开始滚动,否则不应该触发。 我尝试过谷歌搜索,但没有成功。有一篇文章说css转换对它产生了某种影响,但你们可以看到在我的例子中并没有转换 函数完成(){ $(window).on('scroll.c',function(){ console.log('scrolled'); }); } 函数滚动到(e){ e、 预防默认值(); $(window.off('s

我创建了一个简单的示例。我有一个代码,在动画完成后将滚动事件注册到窗口,但您可以在控制台中看到滚动事件被触发了1-2次,我相信除非我真的开始滚动,否则不应该触发。 我尝试过谷歌搜索,但没有成功。有一篇文章说css转换对它产生了某种影响,但你们可以看到在我的例子中并没有转换

函数完成(){
$(window).on('scroll.c',function(){
console.log('scrolled');
});
}
函数滚动到(e){
e、 预防默认值();
$(window.off('scroll.c');
$('html,body')。设置动画({
“scrollTop”:$(“#到”).offset().top
},200,完成);
}
$('#link')。在('click',scrollTo')

XXX

将事件的重新注册延迟50毫秒似乎可以解决问题:

函数完成(){
setTimeout(函数(){
$(window).on('scroll.c',function(){
console.log('scrolled');
});
}, 10);
}
函数滚动到(e){
e、 预防默认值();
var gottone=false;
$(window.off('scroll.c');
$('html,body')。设置动画({
“scrollTop”:$(“#到”).offset().top
},200,函数(){
如果(!完成){
gottone=true;
完成();
}
});
}
$('#link')。在('click',scrollTo')

XXX

我猜超时可以解决这个问题,但我发现超时解决方案很蹩脚,我错了吗?不管怎样,我已经在这方面花了太多时间,我只会使用超时。我想知道是否有更好的解决办法。谢谢。@user8672473:有时是这样,但有时很好(特别是,使用
setTimeout(…,0)
设置要在下一次事件循环中运行的内容很好)。像上面这样的方法绝对是万不得已的。但是当0ms不起作用时(例如,不仅仅是下一个循环的调度问题),我想不出还有什么可以响应的(除了第一个滚动事件)。顺便说一句,我已经更新了代码段:您的
done
将被原始代码调用两次,因为回调是针对每个元素的。