Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检测是否以编程方式生成onscroll事件?_Javascript_Html - Fatal编程技术网

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

Javascript 如何检测是否以编程方式生成onscroll事件?,javascript,html,Javascript,Html,我希望在用户滚动时触发处理程序,但我不希望在浏览器代表用户滚动时发生。例如,下面的文档作为onload的一部分进行滚动。这会激发我的onscroll处理程序,但我不想这样。即使我删除了onload,仍然存在一个问题:如果用户滚动然后重新加载页面,处理程序会在重新加载时触发。再说一遍,我不想那样 处理程序能否检测到是谁导致它被触发 <html> <body onscroll="alert('scroll detected')" onload="window.scr

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

aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj
kkk
lll
mmm
nnn
ooo
ppp
qqq
rrr
sss
ttt
uuu
vvv
www
xxx
yyy
zzz
document.onReady
事件期间添加
onscroll
事件,而不是在body命令上内联,如何?我认为这应该允许浏览器在添加
onScroll
事件之前滚动到该位置

另一个选项是添加一个
setTimeout()
调用函数,在文档完全呈现几百毫秒后添加
onscroll
事件。

简而言之:您不能

尽管如此,在javascript库(如Prototype)的帮助下,使用自定义事件执行类似操作非常容易:

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

观察('user:scrolling',function(){alert('yay!');});
...

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

在操作前后检查某些属性的状态变化将有助于确定操作的原因,假设这些相关属性根据变化的原因而发生不同的变化

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

  • 由于文档被滚动
  • 当某人执行滚动时
  • 当浏览器执行滚动时
当用户滚动文档时,他们可能会:

  • 按一个键(向下箭头、向上箭头、向下翻页、向上翻页、ctrl-end、ctrl-home)
  • 将指针移到滚动条上,单击一点,离开滚动条
以下事件模式将指示一个人滚动:

  • 按下滚动相关键或鼠标离开浏览器画布(在滚动条上)
  • 文档滚动
在浏览器执行该操作的情况下,文档仅滚动,而没有任何之前的相关键或鼠标事件


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

在以编程方式移动屏幕时设置(布尔)标志,并在移动完成后再次取消设置,如何?然后,您的滚动侦听器将首先检查该标志,并根据该标志进行操作?

下面的任何答案是否有帮助?如果您以编程方式滚动时,事件队列中已存在浏览器启动的滚动事件,则此操作无效。