在jQuery获取鼠标滚轮事件?
有没有办法在jQuery中获得鼠标滚轮事件(而不是讨论scroll
事件)?
有一个插件可以检测上下鼠标滚轮和一个区域的速度。
$(document).ready(function(){ $('#foo').bind('mousewheel', function(e){ if(e.originalEvent.wheelDelta /120 > 0) { console.log('scrolling up !'); } else{ console.log('scrolling down !'); } }); });
绑定mousewheel
和DOMMouseScroll
最终对我来说真的很好:
$(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; }); })();
有关“鼠标滚轮”事件的答案指的是不推荐使用的事件。 标准事件只是“轮子”。 见https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel
这对我工作:)
//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
这是一个香草的解决scheme。 可以在jQuery中使用,如果事件传递给函数event.originalEvent
哪些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
这是在每个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"); } }); });
截至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 +
我今天遇到了这个问题,发现这个代码对我来说工作的很好
$('#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'); } });
使用这个代码
knob.bind('mousewheel', function(e){ if(e.originalEvent.wheelDelta < 0) { moveKnob('down'); } else { moveKnob('up'); } return false; });
我的组合看起来像这样。 它会逐渐淡出并逐渐消失。 否则你必须滚动到标题,淡入标题。
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; });
@DarinDimitrov发布的插件jquery-mousewheel
mousewheel 与jQuery 3+有关 。 使用jQuery 3+的jquery-wheel
更为明智。
如果你不想去jQuery路由, MDN高度警告使用mousewheel
事件,因为它是非标准的,在许多地方不受支持。 它反而说, 你应该使用wheel
事件,因为你得到更多的特异性,而不是你所得到的价值是什么意思。 它受到大多数主stream浏览器的支持。
如果使用提到的jquery mousewheel插件 ,那么怎样使用事件处理函数的第二个参数 – delta
:
$('#my-element').on('mousewheel', function(event, delta) { if(delta > 0) { console.log('scroll up'); } else { console.log('scroll down'); } });
最近我得到了同样的问题, $(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'; } } }