在jQuery中获取鼠标滚轮事件?


130

有没有一种方法可以scroll在jQuery中获取鼠标滚轮事件(而不是谈论事件)?


1
快速搜索发现此插件可能会有所帮助。
Jerad Rose 2011年

这个解决方案对我
有用

@thejh通过DOM3事件发布了有关此问题的新答案:stackoverflow.com/a/24707712/2256325
Sergio


只是一个注意事项。如果您只是想检测输入的更改,而不是通过鼠标滚轮检测更改,请尝试$(el).on('input', ...
rybo111

Answers:



201
$(document).ready(function(){
    $('#foo').bind('mousewheel', function(e){
        if(e.originalEvent.wheelDelta /120 > 0) {
            console.log('scrolling up !');
        }
        else{
            console.log('scrolling down !');
        }
    });
});

51
DOMMouseScroll事件在FF使用,所以你必须要在两个听.bind('DOMMouseScroll mousewheel') {evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/...
mrzmyr

9
e.originalEvent.wheelDelta在FF23中未定义
hofnarwillie 2013年

26
您不需要除以120,这是对CPU的无用浪费
venimus 2013年

6
一定是最好的答案

2
但是无论如何,为什么要除以120?那是什么常数?(您不必像venimus所指出的那样。)
mshthn

145

绑定到两者mousewheelDOMMouseScroll最终对我来说工作得很好:

$(window).bind('mousewheel DOMMouseScroll', function(event){
    if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
        // scroll up
    }
    else {
        // scroll down
    }
});

此方法适用于IE9 +,Chrome 33和Firefox 27。


编辑-2016年3月

因为已经有一段时间了,所以我决定重新讨论这个问题。滚动事件的MDN页面具有一种使用检索滚动位置的好方法requestAnimationFrame,这比我以前的检测方法更可取。我修改了他们的代码,以提供除了滚动方向和位置以外的更好兼容性:

(function() {
  var supportOffset = window.pageYOffset !== undefined,
    lastKnownPos = 0,
    ticking = false,
    scrollDir,
    currYPos;

  function doSomething(scrollPos, scrollDir) {
    // Your code goes here...
    console.log('scroll pos: ' + scrollPos + ' | scroll dir: ' + scrollDir);
  }

  window.addEventListener('wheel', function(e) {
    currYPos = supportOffset ? window.pageYOffset : document.body.scrollTop;
    scrollDir = lastKnownPos > currYPos ? 'up' : 'down';
    lastKnownPos = currYPos;

    if (!ticking) {
      window.requestAnimationFrame(function() {
        doSomething(lastKnownPos, scrollDir);
        ticking = false;
      });
    }
    ticking = true;
  });
})();

请参阅CodePen上的Jesse Dupuy 的Pen Vanilla JS滚动跟踪@ blindside85)。

该代码目前正在使用 Chrome v50, Firefox v44, Safari v9, and IE9+

参考文献:


这对我来说效果最好。但是,此脚本是按滚轮的“单击”运行的。对于某些脚本而言,这可能是不堪重负的。有没有一种方法可以将每个滚动事件视为一个实例,而不是每次单击滚轮都运行脚本?
2014年

不特别。据我所知,许多人要么避免处理滚动跟踪,要么改用计时器(例如,每x毫秒检查一次用户在页面上的位置,等等)。如果有更好的解决方案,我肯定想知道!
Jesse Dupuy 2014年

1

1
感谢更新。您可以将代码复制到答案中吗?永远不知道Codepen是否有一天会崩溃。以前发生过
JDB仍记得Monica's

2
@JesseDupuy,我赞成这个答案,但是如果文档适合视图(“宽度:100vh;高度:100vh”)或出现“溢出:隐藏;”,则您的更新版本不起作用。“ window.addEventListener('scroll',callback)”不是对“ window.addEventListener('mousewheel',callback)”的正确答案。
丹尼尔(Daniel)

45

截至2017年,您可以编写

$(window).on('wheel', function(event){

  // deltaY obviously records vertical scroll, deltaX and deltaZ exist too
  if(event.originalEvent.deltaY < 0){
    // wheeled up
  }
  else {
    // wheeled down
  }
});

适用于当前的Firefox 51,Chrome 56,IE9 +


37

谈论“鼠标滚轮”事件的答案是指已过时的事件。标准事件只是“转盘”。参见https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel


20
我尝试了这些,发现:“ wheel”在Firefox和IE中有效,但在Chrome中不起作用。“ mousewheel”可在Chrome和IE中使用,但不能在Firefox中使用。“ DOMMouseScroll”仅在Firefox中有效。
Curtis Yallop 2013年

1
哇,这节省了我很多时间。谢谢!
gustavohenke

3
Chrome似乎在2013年8月添加了对“转轮”的支持:code.google.com/p/chromium/issues/detail?
id=227454

2
Safari仍然不支持wheel事件。
Thayne 2014年

正如您的文档所述, 不wheel支持event的不是同一件事情。CanIuseEdgeIE
Alex

16

这为我工作:)

 //Firefox
 $('#elem').bind('DOMMouseScroll', function(e){
     if(e.originalEvent.detail > 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });

 //IE, Opera, Safari
 $('#elem').bind('mousewheel', function(e){
     if(e.originalEvent.wheelDelta < 0) {
         //scroll down
         console.log('Down');
     }else {
         //scroll up
         console.log('Up');
     }

     //prevent page fom scrolling
     return false;
 });

从stackoverflow


14

这是一种香草的解决方案。如果传递给函数的事件是event.originalEventjQuery可以用作jQuery事件的属性,则可以在jQuery中使用。或者如果在下面的callback函数中,我们在第一行之前添加:event = event.originalEvent;

此代码对滚轮速度/量进行了归一化,对于典型的鼠标是向前滚动,而向后滚动则为负。

演示:http//jsfiddle.net/BXhzD/

var wheel = document.getElementById('wheel');

function report(ammout) {
    wheel.innerHTML = 'wheel ammout: ' + ammout;
}

function callback(event) {
    var normalized;
    if (event.wheelDelta) {
        normalized = (event.wheelDelta % 120 - 0) == -0 ? event.wheelDelta / 120 : event.wheelDelta / 12;
    } else {
        var rawAmmount = event.deltaY ? event.deltaY : event.detail;
        normalized = -(rawAmmount % 3 ? rawAmmount * 10 : rawAmmount / 3);
    }
    report(normalized);
}

var event = 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll';
window.addEventListener(event, callback);

还有一个jQuery插件,它在代码中更加冗长,并带有一些额外的糖:https : //github.com/brandonaaron/jquery-mousewheel


8

这适用于每个IE,Firefox和Chrome的最新版本。

$(document).ready(function(){
        $('#whole').bind('DOMMouseScroll mousewheel', function(e){
            if(e.originalEvent.wheelDelta > 0 || e.originalEvent.detail < 0) {
                alert("up");
            }
            else{
                alert("down");
            }
        });
    });

5

我今天陷入了这个问题,发现这段代码对我来说很好用

$('#content').on('mousewheel', function(event) {
    //console.log(event.deltaX, event.deltaY, event.deltaFactor);
    if(event.deltaY > 0) {
      console.log('scroll up');
    } else {
      console.log('scroll down');
    }
});

4

使用此代码

 knob.bind('mousewheel', function(e){  
 if(e.originalEvent.wheelDelta < 0) {
    moveKnob('down');
  } else {
    moveKnob('up');
 }
  return false;
});

0

我的组合看起来像这样。它会在每次向下/向上滚动时淡出和淡入。否则,您必须向上滚动到标题,以便淡入标题。

var header = $("#header");
$('#content-container').bind('mousewheel', function(e){
    if(e.originalEvent.wheelDelta > 0) {
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    else{
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);
    }
});

上面的代码并未针对触摸/移动设备进行过优化,我认为这对所有移动设备都更好:

var iScrollPos = 0;
var header = $("#header");
$('#content-container').scroll(function () {

    var iCurScrollPos = $(this).scrollTop();
    if (iCurScrollPos > iScrollPos) {
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);

    } else {
        //Scrolling Up
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    iScrollPos = iCurScrollPos;

});


0

如果使用提到的jquery mousewheel插件,那么将使用事件处理程序函数的第二个参数- delta

$('#my-element').on('mousewheel', function(event, delta) {
    if(delta > 0) {
    console.log('scroll up');
    } 
    else {
    console.log('scroll down');
    }
});

-3

我最近在$(window).mousewheel返回的地方遇到了同样的问题 undefined

我所做的是 $(window).on('mousewheel', function() {});

进一步处理它,我正在使用:

function (event) {
    var direction = null,
        key;

    if (event.type === 'mousewheel') {
        if (yourFunctionForGetMouseWheelDirection(event) > 0) {
            direction = 'up';
        } else {
            direction = 'down';
        }
    }
}

您没有说什么具有newUtilities.getMouseWheelDirection
ccsakuweb 2014年

这超出了这个问题的范围。所以它不是复制粘贴网站。
Szymon Toda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.