【问题标题】:Scroll Counter - _.debouce fix滚动计数器 - _.debounce 修复
【发布时间】:2013-11-04 18:39:56
【问题描述】:

我的问题

我创建了一个计数器,每次用户向上或向下滚动时都会升高或降低一个。问题是我的柜台

$('html').on('mousewheel', function (e) {
    var delta = e.originalEvent.wheelDelta;

    if (delta < 0) {
        --count;
        transitionScreen(count);
        //$('h1').text ('You scrolled down');

    } else if (delta > 0 && count < 0) {
        ++count;
        transitionScreen(count);
        //$('h1').text ('You scrolled up');
    }
});

被滚动多次递增。

解决方案

所以有人建议使用 underscore.js 的 debounce function 来防止我的计数器函数在给定的时间内被多次执行。

问题是我不知道如何实施解决方案:

有人可以帮我使用 _.debounce 这个函数吗?我正在查看示例,但不完全了解如何在此处使用它。我是 javascript 的新手,并且很快就学会了,所以任何帮助都将不胜感激。

文档剪辑

Debounce 在文档中是这样使用的:

debounce_.debounce(function, wait, [immediate]) 

下面是一个用法示例:

var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);

谢谢!

【问题讨论】:

  • 啊,很好。我试图太复杂,并将参数放入变量中,就像示例一样。谢谢!
  • 是的。保持简单:-)

标签: javascript jquery function underscore.js counter


【解决方案1】:
$('html').on('mousewheel', _.debounce(function(e){
    var delta = e.originalEvent.wheelDelta;

    if (delta < 0) {
        --count;
        transitionScreen(count);
        //$('h1').text ('You scrolled down');

    } else if (delta > 0 && count < 0) {
        ++count;
        transitionScreen(count);
        //$('h1').text ('You scrolled up');
    }
}, 250));

就是这样。就像它显示的那样,不是传递你的函数,而是传递_.debounce 函数的结果。

【讨论】:

  • 要小心。在笔记本电脑触控板(和 Apple 魔术鼠标或笔记本电脑)上,每次滚动都会触发 mousewheel 事件数十次。通常在 50 到 100 次之间!!!计数器将一次增加 50 个单位!
  • @Alvaro:这正是debounce 所阻止的。无论事件触发多少次,该函数都只会运行一次(最后一个事件触发后250ms)。
  • @RocketHazmat 哦,我明白了,它使用了setTimeout... 有趣...但仍然会产生不必要的变量增加,因为您无法预测滚动时间。这可能很容易从 300 毫秒变为 700 毫秒甚至更多,具体取决于用户移动手指的速度。在那之后,如果用户结束滚动,计数器将增加数十。
  • @Alvaro:你的意思是如果用户滚动太慢?我知道。那可能是个问题。还有throttle 在这里可能会更好。略有不同。
  • @RocketHazmat 我不明白为什么那个应该工作。问题还是一样。如果您将wait 设置为400 毫秒并且用户滚动了800 毫秒,那么计数器将增加两次而不是一次。 (不是我之前说的几十,我的错)。
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2014-06-26
  • 2019-06-23
相关资源
最近更新 更多