3

我们的主 UI 上有一个 UI 小部件,它使用 JavaScript 来响应来自浏览器的滚动事件。每个滚动事件的响应都是相对昂贵的。用户可以轻松地将大量滚动事件“排队”,而前几个正在处理并在小部件中呈现。

这样做的问题是,小部件最终进入“滚动处理炼狱”,每个增量中间滚动事件都被处理和呈现。

例如:用户从 ab 滚动,然后是 bc,然后是 de,然后是 ef,依此类推。到用户触发 yz 事件时,滚动事件处理可能仍在渲染 bc 滚动。

相反,我们想做的是对这些事件进行更智能的管理。如果我们可以渲染滚动事件的结果,然后“赶上”用户所在的位置,并跳过任何现在已经过时的中间滚动,那就太好了。

最好的方法是什么?

4

1 回答 1

2

您可能已经在做类似的事情,但我会使用一个计时器来判断用户是否仍在积极滚动。

类似于这样的东西:

// need to have this variable outside the scope of the handler defined below
var timeoutId = null;

// think of "connect" as pseudocode for whatever you use to connect handlers
connect(widget, "onscroll", function() {
    // ...scrolling...
    if(timeoutId != null) clearTimeout(timeoutId);
    timeoutId = setTimeout(function() {
        // *probably* done scrolling, it has been  
        // 1 second since the last scroll...  
        // run your code to render current position here  
    }, 1000);
});
于 2008-11-25T17:48:58.100 回答