返回信息流求问各位大神,是如何阻止window.scroll多次执行的?我看网上都是设置一个全局变量,如图,但是我试的时候是只能执行一次了,就是无论你滚动多少次,都只执行一次,但我想要的是,每次滚动,执行一次。。。不知道我讲清楚没有。。。
这是一条镜像帖。来源:北邮人论坛 / java-script / #4320同步于 2018/9/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
【问题】阻止window.onscroll多次执行
Lky0213
2018/9/26镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
只执行一次是因为你用了变量 tur,去掉即可。滚动事件高频触发,为了性能着想,最好加上节流。
```javascript
var sayHi = function() {
alert('hi')
}
var throttle = function(fn, delay){
var timer = null
return function(){
var context = this, args = arguments
clearTimeout(timer)
timer = setTimeout(function(){
fn.apply(context, args)
}, delay)
}
}
// 无节流
window.onscroll = sayHi
// 节流
window.onscroll = throttle(sayHi, 100)
```
【 在 Lky0213 的大作中提到: 】
: 求问各位大神,是如何阻止window.scroll多次执行的?我看网上都是设置一个全局变量,如图,但是我试的时候是只能执行一次了,就是无论你滚动多少次,都只执行一次,但我想要的是,每次滚动,执行一次。。。不知道我讲清楚没有。。。[upload=1][/upload]
对对对,就是这样,谢谢谢谢!
【 在 MrWanted 的大作中提到: 】
: [md]
: 只执行一次是因为你用了变量 tur,去掉即可。滚动事件高频触发,为了性能着想,最好加上节流。
:
: ...................
其实楼上说的是防抖(debounce)。防抖和节流(throttle)还是有区别的。
防抖是一个函数触发后过一段时间再执行回调,如果这段时间里有新的触发,则清理计时器,重新等待一段时间。
节流是在一个时间周期(自己定义)内只会执行一次回调,如果多次触发也只会执行一次。
对应于上面的情况来说,如果你的onscroll用了防抖,那么如果你拖拽浏览器滚动条不管多久,那么你的函数只会在你停下来之后的一段时间后触发一次。
如果你的onscroll用了节流,那么你拖拽浏览器滚动条假如本来要触发100次函数,那么用了节流只会触发20次(根据你的单位时间举例)。
所以二者还是有区别的。另外还可以把节流和防抖放在一起,这就是后话了。
说的没错,解释的很清楚哈,赞一个。
不知道他的实际场景,我自以为是的用节流了。防抖在 scroll 或 resize 这种事件中的使用更常见。
【 在 PiEgg 的大作中提到: 】
: 其实楼上说的是防抖(debounce)。防抖和节流(throttle)还是有区别的。
: 防抖是一个函数触发后过一段时间再执行回调,如果这段时间里有新的触发,则清理计时器,重新等待一段时间。
: 节流是在一个时间周期(自己定义)内只会执行一次回调,如果多次触发也只会执行一次。
: ...................
求问为啥楼主贴的方法只能执行一次函数,感觉作用和防抖一样?
【 在 PiEgg 的大作中提到: 】
: 其实楼上说的是防抖(debounce)。防抖和节流(throttle)还是有区别的。
: 防抖是一个函数触发后过一段时间再执行回调,如果这段时间里有新的触发,则清理计时器,重新等待一段时间。
: 节流是在一个时间周期(自己定义)内只会执行一次回调,如果多次触发也只会执行一次。
: ...................
因为他写的tur是全局变量,在第一个setTimeout里变成false之后就再也进不了那个if了。所以只能执行一次。
跟防抖不一样,楼主这个是只要触发过一次之后,用户再也无法触发。防抖是用户停下滚动事件才触发,但是只要触发了滚动事件之后就会触发。
【 在 pigpiggirl 的大作中提到: 】
: 求问为啥楼主贴的方法只能执行一次函数,感觉作用和防抖一样?
setTimeout里的回调函数不是把tur变成true了吗,下次滚动不就能进去那个if吗大佬?
【 在 PiEgg 的大作中提到: 】
: 因为他写的tur是全局变量,在第一个setTimeout里变成false之后就再也进不了那个if了。所以只能执行一次。
: 跟防抖不一样,楼主这个是只要触发过一次之后,用户再也无法触发。防抖是用户停下滚动事件才触发,但是只要触发了滚动事件之后就会触发。
哦哦抱歉我没看到haha函数里把tur设为true了。那么应该会触发的。
我也不是大佬[ema12]
【 在 tusiyun 的大作中提到: 】
: setTimeout里的回调函数不是把tur变成true了吗,下次滚动不就能进去那个if吗大佬?