Передача данных события прокрутки в функцию газа - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь создать свой собственный простой скрипт прокрутки с полной высотой, используя событие wheel и функцию газа (так как я хочу, чтобы 1 прокрутка регистрировалась каждые X миллисекунд. Я хочу передать данные события wheel событие в функцию, которая блокируется моей throttle() функцией.

Вот упрощенная версия моего кода:

function throttle(callback, limit) {
    var wait = false; // Initially, we're not waiting
    return function () { // We return a throttled function
        if (!wait) { // If we're not waiting
            callback.call(); // Execute users function
            wait = true; // Prevent future invocations
            setTimeout(function () { // After a period of time
                wait = false; // And allow future invocations
            }, limit);
        }
    }
}

function onScroll(event) {
  // do stuff here on scroll
}

window.addEventListener('wheel', throttle(onScroll, 700), false);

Это будет работать нормально, если мне не нужноданные из события wheel, но мне нужно определить направления прокрутки внутри моей функции onScroll(), используя event.deltaY.

По сути, я хочу изменить последнюю строку на следующую (хотя я знаю этоне сработает):

window.addEventListener('wheel', throttle(onScroll(event), 700), false);

Итак ...

Как передать данные события wheel в onScroll() функционирует, все еще ограничивая его?

Что я пробовал:

Я попробовал следующий код, чтобы я мог передать данные event в throttle() функция, которая работала успешно

window.addEventListener('wheel', function(e) {
  throttle(onScroll, 700, e)
}, false);

Но я тогда не уверен, чтоделать с e внутри моей функции throttle(), чтобы иметь возможность передать ее в функцию onScroll().Я попытался изменить строку с:

callback.call(); // Execute users function

на:

callback.call(e); // Execute users function (используя e, переданный в функцию газа)

Но это остановило функцию onScroll даже от вызова ... (Я предполагаю, что throttle() возвращает функцию, но эта возвращенная функция не вызывается, потому что она заключена в другую функцию в eventListener?)

1 Ответ

2 голосов
/ 14 марта 2019

Просто передайте аргументы:

function throttle(callback, limit) {
  var wait = false;
  return function (...args) { 
    if (!wait) {
        callback(...args);
        wait = true; 
        setTimeout(function () { 
            wait = false; 
        }, limit);
    }
  }
}
...