如何在触摸设备上检测是否只触发一次滚动事件*?

时间:2012-09-07 01:00:40

标签: javascript iphone ios ipad touch

iOS设备(可能是Android设备)具有不同的滚动行为:scroll事件仅在整个滚动完成后触发一次

如何检测浏览器是否以这种方式运行?

我可以使用window.TouchModernizr.touch,但他们不会告诉我有关滚动行为的任何信息,这就好像是在询问某人是否是法国人了解他们是否喜欢羊角面包,对吧? :)

1 个答案:

答案 0 :(得分:2)

我认为您的检测是正确的,因为会有一些设备支持触摸和鼠标行为(如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()将是您的滚动处理逻辑。

这会让你采用混合方法。它总是在最近没有滚动事件时到达的第一个滚动事件触发。如果有一系列滚动事件,则它会在第一个事件上触发,然后等待它们停止一秒钟。

您可能想要调整两个数字。第一个确定滚动事件必须与相同的用户操作(当前设置为500毫秒)快速触发它们的接近程度。第二个确定您等待处理当前滚动位置并假设用户停止移动滚动条(当前设置为1)的等待时间。