仅执行一次功能

时间:2014-10-06 21:00:13

标签: jquery jquery-waypoints

当我向下滚动页面时,我正在使用Waypoints.js来启动计数器功能:

$(".counter").waypoint(function() {
  $(".counter").count();
}, {offset:"100%"});

一切都很好但是如果我向上滚动页面再向下滚动到计数器,它会重新开始计数。如何只执行一次计数器功能?

4 个答案:

答案 0 :(得分:2)

不确定该代码的用途,但您总是可以使用flag变量来控制这样的代码:

var executed = false;
$(".counter").waypoint(function() {
    if (!executed) {
        executed = true;
        $(".counter").count();
    }
}, {offset:"100%"});

答案 1 :(得分:1)

我知道这已经有了一个已接受的答案,但当前版本的jQuery Waypoints,2.x已经内置了triggerOnce选项。如果它应该执行,你不需要手动保留一个标志。

$(".counter").waypoint(function() {
  $(".counter").count();
}, {offset:"100%", triggerOnce:true});

这与在处理程序末尾的航点上调用destroy以使它永远不会再次执行相同:

$(".counter").waypoint(function() {
  $(".counter").count();
  $(this).waypoint('destroy');
}, {offset:"100%"});

答案 2 :(得分:0)

您可以在事件第一次触发时设置哨兵值,并在下次基于此时跳过逻辑。

这是你可以做到的一种方式:

var count = 0;

$(".counter").waypoint(function() {
  if (count > 0) return;
  $(".counter").count();
  count++;
}, {offset:"100%"});

答案 3 :(得分:0)

这个功能做得很好,没有任何需要照顾的额外变量或状态:

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

https://jsfiddle.net/uje57boz/1/