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

the*_*ejh 124 javascript jquery mousewheel

有没有办法scroll在jQuery中获取鼠标滚轮事件(而不是讨论事件)?

小智 189

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

  • `DOMMouseScroll`事件在FF中使用,所以你必须同时监听`.bind('DOMMouseScroll mousewheel'){`evetns https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/ DOMMouseScroll (50认同)
  • 你不需要除以120它是无用的浪费cpu (24认同)
  • 在FF23中未定义`e.originalEvent.wheelDelta` (9认同)
  • 一定是最好的答案 (6认同)
  • 但无论如何,你为什么要把它除以120?这是什么常数?(你不必像Venimus指出的那样.) (2认同)

Jes*_*puy 142

绑定到两个mousewheelDOMMouseScroll最终为我工作非常好:

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

此方法适用于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;
  });
})();
Run Code Online (Sandbox Code Playgroud)

请参阅CodePen上的Jesse Dupuy(@ blindside85)的Pen Vanilla JS Scroll Tracking.

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

参考文献:

  • @JesseDupuy,我会赞成这个答案,但如果文档符合视图("宽度:100vh;高度:100vh")或得到"溢出:隐藏;",则更新版本不起作用."window.addEventListener('scroll',callback)"不是"window.addEventListener('mousewheel',callback)"的正确答案. (2认同)

Dar*_*rov 46

有一个插件可以检测上/下鼠标滚轮和区域内的速度.

  • 插入?来吧..检查下面的答案,你可以没有 (31认同)
  • 除了你的无插件版本在最新的FF中不起作用. (15认同)

Lou*_*ine 43

截至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
  }
});
Run Code Online (Sandbox Code Playgroud)

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

  • 最简单的方法,应该接受答案 (3认同)

Bri*_*lma 37

谈论"mousewheel"事件的答案是指一个弃用的事件.标准事件只是"轮子".请参阅https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel

  • 我尝试了这些并发现:"wheel"适用于Firefox和IE,但不适用于Chrome."mousewheel"适用于Chrome和IE,但不适用于Firefox."DOMMouseScroll"仅适用于Firefox. (20认同)
  • 看起来Chrome在2013年8月增加了对"wheel"的支持:https://code.google.com/p/chromium/issues/detail?id = 227454 (3认同)
  • Safari仍然不支持滚轮事件. (2认同)

Anj*_*K P 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;
 });
Run Code Online (Sandbox Code Playgroud)

来自stackoverflow


Ser*_*gio 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);
Run Code Online (Sandbox Code Playgroud)

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


fut*_*ayv 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");
            }
        });
    });
Run Code Online (Sandbox Code Playgroud)


Pra*_*rma 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');
    }
});
Run Code Online (Sandbox Code Playgroud)