博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于javascript的window.onscroll方法
阅读量:4982 次
发布时间:2019-06-12

本文共 2248 字,大约阅读时间需要 7 分钟。

---恢复内容开始---

今天在学习javascript的过程中被onscroll这个东西堵了一下午.心情极度郁闷.

在高度较大的网页中,我们通常会加一个返回顶部的按钮,方便用户操作.

代码如下:

            

弄这么多DIV纯粹是为了填充高度,其实大可不必,设置一个高大上的DIV足以,但是当时脑残了.废话不说.实现的功能就是点击返回顶部按钮的时候,页面可以以一个舒服的缓慢减速效果移动到顶部.这当中就产生了一个问题.如果页面很长,用户在点击返回顶部按钮后,页面移动到顶部的过程中想停下来(也许发现了什么有趣的东西),如何去停止计时器.

大家知道,在页面想顶部移动过程中,势必要触发window.scroll事件.如果要在触发事件后停下来的话,很简单:

window.onscroll = function(){     clearInterval(timer);          }

这样,只要用户在页面返回顶部过程中拖动滑动条,页面就会停止自动滚动.但是很明显,返回顶部的函数也会触发window.onscroll事件,这样,我们点击返回顶部后,页面向上移动一下,就会停下来.因为计时器被清除了.

那么如何才能让浏览器识别出到底是系统在执行函数的自动滚动,还是用户自己操作的呢?

在第一段代码中,我们声明了一个变量:oSys,定义为true.之后我们在计时器函数中插入了它(请自己看代码).这样每次计时器执行内置函数的时候,都会初始化oSys的值为true.

结合下面的代码段:

window.onscroll = function(){   oSys = false;    }

效果就是,当计时器中的函数在执行过程中,oSys变量的值被初始化为true.而一旦函数执行滚动语句,就触发window.onscroll事件,导致oSys的值变为false?为了检验这个结论,下了下面代码

            

结果发现每次弹出的都是true.这说明我们上面的推论是错误的.

那就是说window.onscroll事件是在滚动完成后触发的,而不是滚动的同时.这也符合函数按顺序依次执行的逻辑:在滚动函数执行完成后,进入window.onscroll触发的函数.那么可以确定,每次进入window.onscroll函数时,oSys的值总是true.而触发onscroll事件后,进入onscroll引用的函数function(){oSys = false},然后oSys的值变为false.

假设我们加上这样一段代码

window.onscroll = function(){    if(!oSys)    {        clearInterval(timer);       }      oSys = false;  }

当计时器函数的一个周期执行完毕后,并且触发的onscroll事件函数也执行完毕后,oSys的值一定为false.此时如果又进入了onscroll事件函数,那么有两种可能.

1.计时器函数进入了下一次循环,初始化oSys的值为true.执行完自身后,触发onscroll事件,进入onscroll触发的匿名函数,此事,oSys的值为true.跳过if语句,不清除计时器.

2.计时器还没有进入下一次循环,是用户手动操作触发了onscroll事件的函数,那么此时oSys的值由于没有进过计时器函数内部的oSys初始化,所以值仍然为false.所以会进入if语句,清除计时器.

理解了.

 

转载于:https://www.cnblogs.com/zhangfengyang/p/4085851.html

你可能感兴趣的文章
HUST 1328 String (字符串前缀子串个数 --- KMP)
查看>>
[转]C,C++开源项目中的100个Bugs
查看>>
Linux内核spin_lock与spin_lock_irq分析
查看>>
html input中 button和submit的区别
查看>>
ionic实现点击popup区域外部分来关闭popup
查看>>
Android 架构 3.实现
查看>>
spring+mybatis整合读取不了配置文件
查看>>
字典dict
查看>>
iostat命令
查看>>
认清世界,认清自我,超凡脱俗
查看>>
在yii框架中如何连接数据库mongodb
查看>>
广播发送者与广播接收者
查看>>
只 能处理少于 32766 个字符的字符串
查看>>
表达式语言之EL表达式
查看>>
需求分析
查看>>
解决Win7下网络应用只有进程没有界面的问题
查看>>
半监督学习(一)
查看>>
[置顶] SPL讲解(6)--Condition篇
查看>>
在MyEclipse中配置Weblogic10服务器
查看>>
浙江大学PAT上机题解析之2-11. 两个有序链表序列的合并
查看>>