Javascript:在用户完成滚动后执行操作

IT技术 javascript jquery user-interface scroll
2021-03-03 07:33:14

我正试图找出一种方法来做到这一点。我有一个盒子清单,每个盒子都150px很高。我正在使用 javascript(和 jquery)并希望在用户向下滚动页面后,页面将自动滚动,以便框与页面的其余部分对齐(也就是说,如果用户滚动并且 y页面的位置不能被 150 整除,它将滚动到最近的点)。

现在,我知道我可以使用.scroll()jquery 事件激活一个事件,并且可以使用.scrollTop(). 但是用户移动滚动条的每个像素都会激活整个功能。那么有没有办法将函数从触发延迟到用户还没有滚动,如果他们应该再次开始滚动,该函数将停止?

5个回答

由于您已经在使用 jQuery,请查看Ben Alman 的doTimeout插件,该插件已经处理了方法去抖动(这正是您所追求的)。

从他的网站上无耻地窃取的示例:

$(window).scroll(function(){
   $.doTimeout( 'scroll', 250, function(){
      // do something computationally expensive
   });
});
我希望有人实现了这个想法并且真的成功了。谢谢!!
2021-04-17 07:33:14
这是否考虑了 iOS 设备上的减速?当滚动列表仍在减速并且尚未完全停止时,我看到滚动结束事件被触发。
2021-04-21 07:33:14
伙计。美丽而辉煌。我不认为我会喜欢这样的插件。
2021-04-30 07:33:14
@HetalVora:然后显然没有。我不知道在 iOS 中如何处理惯性滚动。
2021-05-07 07:33:14
+1 不错的插件,只有 1k。去抖动应该包含在 jQuery 1.5 中 :)
2021-05-09 07:33:14

这与 Šime Vidas 的回答基本相同,但不那么复杂:

var scrollTimeout = null;
$(window).scroll(function(){
    if (scrollTimeout) clearTimeout(scrollTimeout);
    scrollTimeout = setTimeout(function(){yourFunctionGoesHere()},500);
});

500 是延迟。鼠标滚动应该没问题。

当然,在滚动事件的事件处理程序中,在 100 或 200 毫秒后触发 setTimeout。让您在滚动事件处理程序中设置的 setTimeout 函数执行您上面提到的定位逻辑。还让滚动事件处理程序清除其自身设置的任何超时。这样,最后一次触发滚动事件时,setTimeout 函数将完成,因为滚动事件尚未清除它。

代码:

var scrollTimeout = null;
var scrollendDelay = 500; // ms

$(window).scroll(function() {
    if ( scrollTimeout === null ) {
        scrollbeginHandler();
    } else {
        clearTimeout( scrollTimeout );
    }
    scrollTimeout = setTimeout( scrollendHandler, scrollendDelay );
});

function scrollbeginHandler() {
    // this code executes on "scrollbegin"
    document.body.style.backgroundColor = "yellow";
}

function scrollendHandler() {
    // this code executes on "scrollend"
    document.body.style.backgroundColor = "gray";
    scrollTimeout = null;
}

在这种情况下,vanilla JavaScript 会很有用。

var yourFunction = function(){
  // do something computationally expensive
}

$(window).scroll(function(){
  yfTime=setTimeout("yourFunction()",250);
});
1)$(window)不是 JavaScript,它是 jQuery 和 2) 这将为用户滚动的每个像素排队一堆 setTimeouts ......
2021-04-21 07:33:14