如何在jQuery中只触发一次MouseWheel事件?

时间:2013-10-01 18:26:57

标签: javascript jquery events mouseevent mousewheel

因此,每次用户通过鼠标滚轮向上或向下滚动时,我只想触发一次功能。见:jsFiddle Demo。问题是即使我有e.preventDefault(),该函数仍然会多次触发。

目标是只要用户向上或向下滚动,该功能只会触发一次。与此site类似。

这是我到目前为止的代码:

var sq = {};
sq = document;
if (sq.addEventListener) {
    sq.addEventListener("mousewheel", MouseWheelHandler(), false);
    sq.addEventListener("DOMMouseScroll", MouseWheelHandler(), false);
} else {
    sq.attachEvent("onmousewheel", MouseWheelHandler());
}

function MouseWheelHandler() {
    return function (e) {
        var e = window.event || e;
        var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
        if (delta < 0) {
            /* Scroll Down */
            e.preventDefault();
            console.log("Down. I want this to happen only once");

        } else {
            /* Scroll Up */
            console.log("up. I want this to happen only once");
            e.preventDefault();
        }
        return false;
    }
    return false;
}

2 个答案:

答案 0 :(得分:2)

This帮助了我:

var isMoving=false;

$(document).bind("mousewheel DOMMouseScroll MozMousePixelScroll", function(event, delta) {
   event.preventDefault();
   if (isMoving) return;
   navigateTo();
});

function navigateTo(){
   isMoving = true;
   setTimeout(function() {
    isMoving=false;
   },2000);
}

基本上你有一个isMoving变量,根据动画或你做的事情是否正在进行设置。即使用户在一次“轻弹”中使用鼠标滚轮多次滚动,该功能也只会触发一次。

答案 1 :(得分:-3)

   ​$(document).ready(function(){
var up=false;
var down=false;
        $('#foo').bind('mousewheel', function(e){
            if(e.originalEvent.wheelDelta /120 > 0 && up=false)  {
up=true;
down=false;
                $(this).text('scrolling up !');
            }
            elseif(e.originalEvent.wheelDelta /120 > 0 && down=false){
down=true;
up=false;
                $(this).text('scrolling down !');
            }
        });
    });

here是一个可以使用它的插件