如何检测onscroll事件是否以编程方式生成?

时间:2009-02-12 19:57:45

标签: javascript html

我想在用户滚动时触发处理程序,但是当浏览器代表用户滚动时我不希望它发生。例如,下面的文档将自身滚动为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>

4 个答案:

答案 0 :(得分:3)

每当您以编程方式移动屏幕时设置(布尔)标志,并在移动完成后再次取消设置时如何?那么你的滚动侦听器会先检查那个标志,并根据它做出动作吗?

答案 1 :(得分:1)

仅检查操作的结果(文档已滚动),您无法确定导致操作的原因。

检查某个操作之前和之后某些属性的状态更改将有助于您确定操作的原因,假设这些相关属性根据更改的原因而有所不同。

您应该考虑可能与滚动文档的操作相关的属性,然后考虑这些属性可能如何更改:

  • 作为滚动文档的结果
  • 当某人执行滚动
  • 当浏览器执行滚动

当一个人滚动文档时,他们可以:

  • 按一个键(向下箭头,向上箭头,向下翻页,向上翻页,ctrl-end,ctrl-home)
  • 将指针移动到滚动条,点击一下,离开滚动条

以下事件模式表示某人滚动:

  • 按下滚动相关键鼠标移出浏览器画布(在滚动条上)
  • 文档滚动

如果浏览器执行操作,则文档仅在没有任何先前相关键或鼠标事件的情况下滚动。

在观察滚动事件发生之前发生的事情时,您应该能够确定该动作是否是由某人发起的。虽然这可能很难实现,但逻辑是合理的。

答案 2 :(得分:0)

如何在onscroll事件期间添加document.onReady事件,而不是在body命令上内联?我认为这应该允许浏览器在添加onScroll事件之前滚动到该位置。

另一种选择是添加setTimeout()来调用函数,以便在文档完全呈现后的几百毫秒内添加onscroll事件。

答案 3 :(得分:0)

简而言之:你不能

虽然使用Prototype这样的javascript库做这样的事情会很容易使用自定义事件:

<script language="javascript">
    document.observe('user:scrolling', function() { alert('yay!'); });
</script>
...
<body onscroll="document.fire('user:scrolling')">