将滚动事件数据传递到节气门功能

时间:2019-03-14 13:58:38

标签: javascript addeventlistener throttling

我正在尝试使用wheel事件和节流功能创建自己的简单全高滚动脚本(因为我只希望每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 个答案:

答案 0 :(得分:2)

只需传递参数:

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