[英]How to I detect if an onscroll event was programmatically generated?
我想在用户滚动时触发处理程序,但是当浏览器代表用户滚动时我不希望它发生。 例如,下面的文档将自身滚动为onload的一部分。 这会触发我的onscroll处理程序,但我不希望它。 即使我删除了onload,仍然存在一个问题:如果用户滚动然后重新加载页面,则处理程序会在重新加载时触发。 再说一遍,我不希望如此。
处理程序可以检测是谁导致它被解雇了吗?
<html>
<body onscroll="alert('scroll detected')"
onload="window.scrollBy(0, document.height)">
aaa<br/>bbb<br/>ccc<br/>ddd<br/>eee<br/>fff<br/>ggg<br/>hhh<br/>iii<br/>
jjj<br/>kkk<br/>lll<br/>mmm<br/>nnn<br/>ooo<br/>ppp<br/>qqq<br/>rrr<br/>
sss<br/>ttt<br/>uuu<br/>vvv<br/>www<br/>xxx<br/>yyy<br/>zzz
</body>
</html>
每当您以编程方式移动屏幕时设置(布尔)标志,并在移动完成时再次取消设置怎么样? 那么你的滚动侦听器会首先检查该标志,并根据它做出它的动作?
在仅检查操作的结果(文档已滚动)时,您无法确定导致操作的原因。
检查操作之前和之后某些属性的状态更改将帮助您确定操作的原因,假设此类相关属性根据更改的原因而有所不同。
您应该考虑可能与滚动文档的操作相关的属性,然后考虑这些属性可能如何更改:
当一个人滚动文档时,他们可以:
以下事件模式表示某人滚动:
在浏览器执行动作的情况下,文档仅滚动而没有任何先前的相关键或鼠标事件。
在观察滚动事件发生之前发生的事情时,您应该能够确定该动作是否是由人发起的。 虽然这可能很难实现,但逻辑是合理的。
如何在document.onReady
事件期间添加onscroll
事件,而不是在body命令上内联? 我认为这应该允许浏览器在添加onScroll
事件之前滚动到该位置。
另一种选择是添加一个setTimeout()
来调用一个函数,在文档完全呈现后的几百毫秒内添加onscroll
事件。
简而言之:你做不到
虽然,在Prototype等javascript库的帮助下做这样的事情会很容易使用自定义事件:
<script language="javascript">
document.observe('user:scrolling', function() { alert('yay!'); });
</script>
...
<body onscroll="document.fire('user:scrolling')">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.