jquery捕获在()之前激发的事件

jquery捕获在()之前激发的事件,jquery,events,Jquery,Events,我调用DIV.scrollTop(200)函数,并且仅在绑定DIV.on('scroll')之后调用,但是DIV.on('scroll')捕获绑定之前调用的DIV.scrollTop(200)事件 为什么以及如何避免这种情况 <div id="1" style="width:300px; height:300px; overflow:scroll; border:1px solid;"> <div style="width:600px; height:600px; "

我调用
DIV.scrollTop(200)
函数,并且仅在绑定
DIV.on('scroll')
之后调用,但是
DIV.on('scroll')
捕获绑定之前调用的
DIV.scrollTop(200)
事件

为什么以及如何避免这种情况

<div id="1" style="width:300px; height:300px; overflow:scroll; border:1px solid;">
     <div style="width:600px; height:600px; "></div>
</div>


$('#1').scrollTop(200);

$('#1').on('scroll', function(){
  $(this).css("background-color", "red");
});

$('#1')。滚动顶部(200);
$('#1')。在('scroll',function()上{
$(this.css(“背景色”、“红色”);
});

滚动
事件看起来是异步的,甚至强制立即重新绘制似乎也不起作用。使用vanilla JS而不是jQuery也不会改变观察到的行为

我看不到任何编程方法来确定
滚动
事件是由用户还是由脚本触发的。我认为增加延迟是你唯一的解决办法

重新绘制(将触发
滚动
事件)将在
requestAnimationFrame
完成后发生,因此仅在以下情况下连接侦听器:

  • requestAnimationFrame
    运行(表示不久将进行重新绘制),并且

  • 设置超时之后(指示重新绘制已发生)

$('#1')。滚动顶部(200);
requestAnimationFrame(()=>{
设置超时(()=>{
$('#1')。在('scroll',function()上{
$(this.css(“背景色”、“红色”);
});
});
});


尝试使用SetTimeOut延迟绑定。好主意,但我不需要延迟。我知道您不想延迟。但是由于滚动行为看起来是不同步的,所以应用1ms或5ms这样的低延迟应该可以解决这个问题。也许零毫秒延迟也可以。2毫秒延迟在Chrome中也可以,但我不知道其他浏览器,也不知道这在未来的浏览器版本中是否足够