Javascript 滚轮上的火灾事件仅滚动一次

Javascript 滚轮上的火灾事件仅滚动一次,javascript,Javascript,重要提示:我确实知道如何检测滚动条是向上还是向下(本网站上也有一些类似的回答问题),但我不知道如何执行以下操作:我想对滚轮滚动条是向上还是向下执行一些功能;我有以下代码: window.addEventListener('wheel',wheel); function wheel(e){ delta = e.deltaY; if (delta > 0) { Func1(); } else {

重要提示:我确实知道如何检测滚动条是向上还是向下(本网站上也有一些类似的回答问题),但我不知道如何执行以下操作:我想对滚轮滚动条是向上还是向下执行一些功能;我有以下代码:

window.addEventListener('wheel',wheel);
    function wheel(e){
        delta = e.deltaY;
        if (delta > 0) {
            Func1();
        } else  {
            Func2();
        }
    }
但是有了这段代码,当控制盘事件继续时,函数一直在被调用,而我只需要在每次新的控制盘事件发生时调用它们一次。我该怎么做呢?

(更新为支持同一方向的多个滚动,并在开始滚动时立即调用每个函数)

您可以保存状态:

var scrollingDirection = 0; //idle
var lastScroll = 9999;
var scrollIdleTime = 300; // time interval that we consider a new scroll event
window.addEventListener('wheel',wheel);
function wheel(e){
    var delta = e.deltaY;
    var timeNow = performance.now();
    if (delta > 0 && ( scrollingDirection != 1 || timeNow > lastScroll + scrollIdleTime) ) {
        Func1();
        scrollingDirection = 1;
    } else if (delta < 0 && ( scrollingDirection != 2 || timeNow > lastScroll + scrollIdleTime)) {
        Func2();
        scrollingDirection = 2;
    }
    lastScroll = timeNow;
}
var scrollingDirection=0//闲置的
var lastScroll=9999;
var scrollIdleTime=300;//我们考虑一个新的滚动事件的时间间隔
window.addEventListener(“轮子”,轮子);
功能轮(e){
var delta=e.deltaY;
var timeNow=performance.now();
如果(增量>0&(滚动方向!=1 | |时间现在>上次滚动+滚动空闲时间)){
Func1();
滚动方向=1;
}else if(delta<0&(scrollingDirection!=2 | | timeNow>lastScroll+scrollIdleTime)){
Func2();
滚动方向=2;
}
lastScroll=timeNow;
}
var scrolled=true;
window.addEventListener(“轮子”,轮子);
功能轮(e){
如果(滚动==真){
滚动=错误
delta=e.deltaY;
如果(增量>0){
Func1();
}否则{
Func2();
}
}
}
函数Func1(){
console.log('1'+滚动);
}
函数Func2(){
console.log('2'+滚动)

}
您需要在执行功能时增加大约300毫秒的延迟。超时后,如果仍然发生事件,则通过清除旧的超时来设置新的超时

检查下面的代码片段

var wheel_timer = 0

window.addEventListener('wheel', function (e) {
    clearTimeout(wheel_timer);
    wheel_timer = setTimeout(function () {
        wheel(e)
    }, 10)
});

function wheel(e) {
    delta = e.deltaY;
    if (delta > 0) {
        Func1();
    } else {
        Func2();
    }
}
一个建议是不要使用
滚轮
事件,您可以
滚动
事件


编辑:改进答案以提供即时响应。

但如果我可以多次向下或向上移动,该怎么办?Fraddy的响应不会在滚动时触发该功能。如果您需要在开始向某个方向滚动时调用它们,我已经修改了我的解决方案,以利用滚动之间的时间。通过这种方式,您可以为一个方向获得多个触发器(只要自上次滚动以来scrollIdleTime中的时间已经过去),并且在您开始滚动时就会调用这些触发器,我认为这更有用。似乎比其他解决方案工作得更好,因为我可以在一个方向上多次执行,而无需重复滚动