【问题标题】:How to get a MouseWheel Event to fire only once in jQuery?如何让 MouseWheel 事件在 jQuery 中只触发一次?
【发布时间】:2013-10-08 00:46:17
【问题描述】:

所以每次用户通过鼠标滚轮向上或向下滚动时,我只想触发一次函数。请参阅: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;
}

【问题讨论】:

  • api.jquery.com/one - 或者,由于您实际上并未使用 jQuery,因此只需在处理程序中调用 removeEventListener。但我怀疑你说的你想要的并不是你想要的?
  • 事件可能不是只触发一次,而是存在某种超时,以防止过于频繁地采取行动。

标签: javascript jquery events mouseevent mousewheel


【解决方案1】:

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 变量,该变量取决于您的动画或您所做的任何事情是否正在进行中。即使用户在一次“轻弹”中使用鼠标滚轮滚动多次,该函数也只会触发一次。

【讨论】:

    【解决方案2】:
       ​$(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是一个可以使用的插件

    【讨论】:

    • on 自 jQuery 1.7 起是首选,为什么你认为这只会触发一次?
    • 对不起。我更新了它...现在它会在用户向上滚动时触发一次,然后在用户向下滚动时再次触发
    • 如果只使用我告诉的那个插件就很简单
    • 我对此投了反对票。首先,您必须更正您的代码。使用else if 而不是elseif。使用up == false!up 检查条件,而不是up=false。无论如何,这没有逻辑。这只会在向上滚动时触发。这样做时,它将一个接一个地返回“向上滚动”和“向下滚动”。以下是纠正错误后的结果:jsfiddle.net/34LgD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多