2012-01-16 156 views
33

所以我试图禁用我的页面上的滚动,当我的灯箱打开时,我发现这个确实有用的脚本。 (http://jsfiddle.net/mrtsherman/eXQf3/3/),不幸的是,当我在自己的页面上使用它时,它禁用了我的lightbox中的滚动功能。我开始用警报调试代码,只是为了发现event.wheelDelta在我的页面上返回“undefined”,而在JSFiddle中,它返回-120。event.wheelDelta返回undefined

+0

我也有过类似的问题,它来到了DOM命名空间。你能表现出一定的代码,或只是检查 – SpYk3HH 2012-01-16 21:10:41

回答

55

jQuery事件处理程序中的event对象不反映真实事件。 wheelDelta是一个非标准事件属性IE和Opera,可通过jQuery事件的originalEvent属性获得。

在jQuery 1.7+中,detail属性在jQuery Event对象中不可用。因此,您还应该在DOMMouseScroll事件中使用event.originalEvent.detail作为此属性。此方法与旧版jQuery版本向后兼容。

event.originalEvent.wheelDelta 

演示:http://jsfiddle.net/eXQf3/22/
参见:http://api.jquery.com/category/events/event-object/

+0

谢谢,它的工作! – CupOfTea696 2012-01-17 16:43:47

+2

你是一个天才!我看了很多其他的解决方案,你的小提琴是唯一一个得到根,实际上作品! – 2012-12-21 21:01:08

+0

谢谢你节省了很多时间 – suvajit 2013-03-20 07:58:21

12
$.fn.wheel = function (callback) { 
    return this.each(function() { 
     $(this).on('mousewheel DOMMouseScroll', function (e) { 
      e.delta = null; 
      if (e.originalEvent) { 
       if (e.originalEvent.wheelDelta) e.delta = e.originalEvent.wheelDelta/-40; 
       if (e.originalEvent.deltaY) e.delta = e.originalEvent.deltaY; 
       if (e.originalEvent.detail) e.delta = e.originalEvent.detail; 
      } 

      if (typeof callback == 'function') { 
       callback.call(this, e); 
      } 
     }); 
    }); 
}; 

,并使用这样的:

$('body').wheel(function (e) { 
    e.preventDefault(); 
    $('#myDiv').append($('<div>').text(e.delta)); 
}); 

大THX以@马克对jQuery的fying功能(:

+1

在最新的Firefox中无法正常工作,发现三角洲隐藏在这里:'if(e.originalEven t && e.originalEvent.deltaY)return e.originalEvent.deltaY * -40' – mpen 2013-09-27 15:52:25

+0

@Mark修正了它,现在应该工作..我希望有一些类型的通用三角洲jquery,我讨厌这个跨浏览器的东西 – 2013-10-03 09:47:05

+1

是啊,我不知道为什么这不会在jQuery核心。我做了一个函数:http://jsfiddle.net/mnbayazit/uTbGp/3/在FF和Chrome中工作,还没有得到它在IE8的工作。 – mpen 2013-10-03 15:42:30

1

我试过你的解决方案,psycho brm,我已经改变了功能extractDelta(e),以使其在Firefox中工作。而不是e.detail我使用e.originalEvent.detail,因为Firefox返回未定义的增量。我已将解决方案和测试代码上传到此post。我希望它有帮助。

function extractDelta(e) { 
    if (e.wheelDelta) { 
     return e.wheelDelta; 
    } 

    if (e.originalEvent.detail) { 
     return e.originalEvent.detail * -40; 
    } 

    if (e.originalEvent && e.originalEvent.wheelDelta) { 
     return e.originalEvent.wheelDelta; 
    } 
} 
+0

“细节”似乎并不存在于最新的Firefox中。它现在似乎分成了deltaX,Y和Z. – mpen 2013-09-27 15:53:47

+1

嗨马克。我刚刚在Mac上的Firefox 27.0.1中测试了这段代码,并检查了鼠标滚轮返回的事件。它仍然包含里面的“originalEvent”元素,在里面,你可以找到“detail”元素。我一直在检查它的价值,它仍然有效。如果您向前后移动车轮,则会改变其符号,并会根据车轮的速度更改其值。我已经获得了正常值:1,-1,2,-1,-4,1 ...我不知道你在哪里发现问题。 – Timbergus 2014-02-23 20:45:54

4
$(this).on('mousewheel DOMMouseScroll', function(e){ 

    var dat = $(e.delegateTarget).data(); //in case you have set some, read it here. 
    var datx = dat.x || 0; // just to show how to get specific out of jq-data object 

    var eo = e.originalEvent; 
    var xy = eo.wheelDelta || -eo.detail; //shortest possible code 
    var x = eo.wheelDeltaX || (eo.axis==1?xy:0); 
    var y = eo.wheelDeltaY || (eo.axis==2?xy:0); //() necessary! 
    console.log(x,y); 

}); 

作品在WebKit和FF,不能证明IE这里:(