等待再次执行功能之前

时间:2015-06-21 12:43:17

标签: javascript jquery scroll delay

我正在玩一些javascript和JQuery。每次用户滚动时,我都会尝试做一些具体的事情。当我使用带有scollwheel的鼠标时,它工作正常。但是当我在笔记本电脑上使用触控板时,速度非常快。我认为这是因为它在滚动时多次执行鼠标滚轮功能。所以我想限制你执行该功能的频率。如果用户继续滚动,则每次通话之间的延迟时间为500毫秒。它不应该延迟功能本身但是立即运行然后再等待500ms才能再次执行。希望你明白。

这是我的代码

$(window).bind('mousewheel', function(event) { // My mousewheel function.
    if (event.originalEvent.wheelDelta >= 0) {
        scroll(-1);
    } else {
        scroll(1);
    }
});

/* Functions */
function scroll(dir) {
    if (dir == -1) {
        if (current > 0) {
            current--;
        }
    } else {
        if (current < list.size() - 1) {
            current++;
        }
    }
    var number = 100 * current;
    var value = "translateY(-" + number + "vh)";
    main.css("transform", value);
    for (var i = 0; i < list.size(); i++) {
        $('#nav li:nth-child(' + (i + 1) + ')').removeClass('active');
    }
    $('#nav li:nth-child(' + (current + 1) + ')').addClass('active');
}

2 个答案:

答案 0 :(得分:1)

您需要的是油门功能。此函数包含其他函数,并检查以ms为单位的延迟和事件的id。

/**
 * @description delay events with the same id, good for window resize events, scroll, keystroke, etc ...
 * @param {Function} func : callback function to be run when done
 * @param {Integer} wait : integer in milliseconds
 * @param {String} id : unique event id
 */
var throttle = (function () {
    var timers = {};

    return function (func, wait, id) {
        wait = wait || 200;
        id = id || 'anonymous';

        if (timers[id]) {
            clearTimeout(timers[id]);
        }

        timers[id] = setTimeout(func, wait);
    };
})(),

你可以像这样使用它:

$(window).on('mousewheel', function () {
    throttle(function(){
        var isScrollUp = event.originalEvent.wheelDelta >= 0 ? -1 : 1;
        scroll(isScrollUp);
    }, 500, 'my mousewheel event');
});

nice example下划线油门-vs-去抖。

答案 1 :(得分:1)

您需要定义一个变量,指示何时运行该函数。在这种情况下是“isScrolling”变量。

 $(window).bind('mousewheel', function(event) { // My mousewheel function.
            if (event.originalEvent.wheelDelta >= 0) {
                scroll(-1);
            } else {
                scroll(1);
            }
        });

        /* Functions */
        var isScrolling = false; // This variable define when to run the function

        function scroll(dir) {

            if(isScrolling){
                return;
            }
            isScrolling = true;

            if (dir == -1) {
                if (current > 0) {
                    current--;
                }
            } else {
                if (current < list.size() - 1) {
                    current++;
                }
            }
            var number = 100 * current;
            var value = "translateY(-" + number + "vh)";
            main.css("transform", value);
            for (var i = 0; i < list.size(); i++) {
                $('#nav li:nth-child(' + (i + 1) + ')').removeClass('active');
            }
            $('#nav li:nth-child(' + (current + 1) + ')').addClass('active');


            setTimeout(function(){
                isScrolling = false;
            },500) // -> Here you can modify the time between functions call
        }