如何检测滚动事件是否像在触摸设备上一样只触发一次
How do I detect whether scroll events are fired *only once* like on touch devices?
iOS设备(可能还有Android设备)具有不同的滚动行为:在整个滚动完成后,scroll
事件只触发一次。
如何检测浏览器是否以这种方式运行?
我可以使用window.Touch
或Modernizr.touch
,但他们不会告诉我任何关于滚动行为的信息,这就像问某人是否是法国人,以了解他们是否喜欢羊角面包,对吧?:)
我认为你的检测是对的,因为会有一些设备同时支持触摸和鼠标行为(如Windows 8平板电脑),有些设备只支持触摸(手机),有些只支持鼠标(台式机)。正因为如此,我认为你不能确切地说一个设备只有一种行为,因为有些设备可能同时具有两种行为。
假设你真正想做的是弄清楚你是否应该立即对每个滚动事件做出响应,或者你是否应该使用短延迟来查看滚动目的地的终点,那么你就可以编码一个混合效果,在任何一种情况下都可以很好地工作。
var lastScroll = new Date();
var scrollTimer;
window.onscroll = function(e) {
function doScroll(e) {
// your scroll logic here
}
// clear any pending timer
if (scrollTimer) {
clearTimeout(scrollTimer);
scrollTimer = null;
}
var now = new Date();
// see if we are getting repeated scroll events
if (now - lastScroll < 500){
scrollTimer = setTimeout(function() {
scrollTimer = null;
doScroll(e);
}, 1000);
} else {
// last scroll event was awhile ago, so process the first one we get
doScroll(e);
}
lastScroll = now;
};
doScroll()
将是您的滚动处理逻辑。
这为您提供了一种混合方法。当最近没有滚动事件时,它总是在到达的第一个滚动事件上启动。如果有一系列滚动事件,那么它会在第一个滚动事件上启动,然后等待,直到它们停止一秒钟。
您可能需要调整两个数字。第一个决定了滚动事件必须有多近才能考虑到它们来自同一用户动作的快速触发(当前设置为500ms)。第二个决定您等待多长时间,直到您处理当前滚动位置并假设用户停止移动滚动条(当前设置为1s)。
相关文章:
- Javascript返回值只在循环中返回一次
- Jquery FadeIn FadeOut 只工作一次
- Javascript html每点击一次就会更改url
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Rails操作只调用一次,但我在ajax中每秒钟都调用一次
- jQuery滚动功能只工作一次
- 刷新导致我的帖子“;张贴“;再一次
- 引导程序崩溃一次只能看到一个
- 有没有一个抽象层,这样我就可以集成一次,然后使用pusher、pubnub或faye
- 加载器组件仅加载一次
- 根据Angular.JS上一次的内容禁用选择
- 一次又一次地在新的和相同的选项卡中打开一个url
- 只在宽度以下和宽度以上各准备一次
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- Angularjs:空对象,当只有一次点击时
- 在Angular应用程序中每个帖子投票一次
- 主干模型更改事件只触发一次
- 如何检测滚动事件是否像在触摸设备上一样只触发一次
- 像Rhino一样,对多个作用域编译一次
- 使复选框可以像单选按钮一样一次选择一个