jquery - jquery 捕获在 .on() 之前触发的事件
问题描述
我DIV.scrollTop(200)
只在 bind 之后调用函数DIV.on('scroll')
,但DIV.on('scroll')
捕获DIV.scrollTop(200)
在 bind 之前调用的事件!
为什么以及如何避免这种情况?
<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");
});
解决方案
该scroll
事件看起来是异步的,甚至强制立即重绘似乎也不起作用。使用 vanilla JS 而不是 jQuery 也不会改变观察到的行为。
我看不到任何以编程方式确定scroll
事件是由用户触发还是由脚本触发的方法。我认为添加延迟是您唯一的解决方法。
重绘(将触发scroll
事件)将在完成后发生,因此仅在requestAnimationFrame
以下情况下附加侦听器:
requestAnimationFrame
运行(表明将很快发生重绘),并且a 之后
setTimeout
(表示已发生重绘)
$('#1').scrollTop(200);
requestAnimationFrame(() => {
setTimeout(() => {
$('#1').on('scroll', function() {
$(this).css("background-color", "red");
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="1" style="width:300px; height:300px; overflow:scroll; border:1px solid;">
<div style="width:600px; height:600px; "></div>
</div>
这将跨浏览器工作,重新绘制时间的机制由规范保证。
另一种可能性是添加另一个scroll
运行一次的处理程序,并停止事件的传播,以便下一个处理程序看不到它:
$('#1').scrollTop(200);
$('#1').one('scroll', function(event) {
event.stopImmediatePropagation();
});
$('#1').on('scroll', function() {
$(this).css("background-color", "red");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="1" style="width:300px; height:300px; overflow:scroll; border:1px solid;">
<div style="width:600px; height:600px; "></div>
</div>
推荐阅读
- unit-testing - 如何使用 jasmine 模拟 window.click(event)
- sql - 在 oracle. 中,替换或引用 reg_exp 中特殊字符的语法是什么,例如 $ 或 @ 或 & 或 |
- sql - 什么是 SQL 中与日期一起使用的“级别”?
- groovy - 在自定义类中使用时出现 Swtbot.syncExec() 问题
- javascript - Reactjs - 未捕获的类型错误:无法读取未定义的属性“then”
- datetime - 默认日期分配失败
- java - 如果另一个应用程序在存储(DB)处更改了数据,如何触发应用程序更新缓存?
- php - 在 Laravel 5.7 上添加日期时间
- python - python regexp 方法返回一个包含空元素的列表
- iis - 智能卡身份验证停止在 IIS 7.5 上工作 - 每个人都得到 401