[JS] - onmusewheel事件(兼容IE,FF)

来源:http://www.denisdeng.com/?p=685

 

相信用户在浏览Google Map 时,都注意到向上或向下滚动鼠标可以使地图放大或缩小。其实,对于鼠标滚动我们并不陌生。但要给一个元素绑定鼠标滚动事件,我们有必要对该事件有一个详尽的了解。

浏览器对该事件支持情况如何?IE6, Opera9+, Safari2+以及Firefox1+均支持“onmousewheel”事件,在FF 3.x中,与之相当的是“DOMMouseScroll”事件。“onmousewheel”作为事件名,不为其识别。所以,为了保证能在每个浏览器中都能运行,就需要针对不同的浏览器来绑定不同的事件。

 

 
  
    var mousewheelevt = ( / Firefox / i.test(navigator.userAgent)) ? " DOMMouseScroll " : " mousewheel " // FF doesn't recognize mousewheel as of FF3.x
if (document.attachEvent) // if IE (and Opera depending on user setting)
document.attachEvent( " on " + mousewheelevt, function (e){alert( ' Mouse wheel movement detected! ' )})
else if (document.addEventListener) // WC3 browsers
document.addEventListener(mousewheelevt, function (e){alert( ' Mouse wheel movement detected! ' )}, false )  

 

 

 

上面的代码给document绑定了mousewheel事件,并能在所有浏览器中运行。但是,鼠标每向上或向下移动一次,滚动了多少?当该事件触发时,在non-FF浏览器中,记录其距离的是“wheelDelta”,它返回的总是120的倍数(120表明mouse向上滚动,-120表明鼠标向下滚动)。在FF中,记录其滚动距离的是“detail”属性,它返回的是3的倍数(3表明mouse向下滚动,-3表明mouse向上滚动)。

需要注意的是,Opera 响应“onmousewheel”事件时,它同时拥有“wheelDelta”和“detail”属性。其“detail”属性返回的值与FF中相同。因此,对Opera 应该用“detail”属性来mouse滚动的距离。在触发滚动事件时,我希望得到整数1或-1。通过上面的分析,我们可以很轻松的得到我们想要的值,对于“wheelDelta”,只需要除以120,对于“detail”,将其除以3即可。

 

 
  
function displayDelta(e){
var evt = window.event || e;
var delta = evt.detail ? - evt.detail / 3 : evt.wheelDelta / 120 ;
return delta ;
}

 

 

 

有了上面的分析,我们可以构建自己的函数为一个对象绑定mousewheel事件。即:

 

 
  
function wheel(obj, fn ,useCapture){
var mousewheelevt = ( / Firefox / i.test(navigator.userAgent)) ? " DOMMouseScroll " : " mousewheel " // FF doesn't recognize mousewheel as of FF3.x
if (obj.attachEvent) // if IE (and Opera depending on user setting)
obj.attachEvent( " on " + mousewheelevt, handler, useCapture);
else if (obj.addEventListener) // WC3 browsers
obj.addEventListener(mousewheelevt, handler, useCapture);

function handler(event) {
var delta = 0 ;
var event = window.event || event ;
var delta = event.detail ? - event.detail / 3 : event.wheelDelta / 120 ;
if (event.preventDefault)
event.preventDefault();
event.returnValue
= false ;
return fn.apply(obj, [event, delta]);
}
}

 

 

在我写这篇文章时,jQuery已经开发了jquery.mousewheel插件。使用该插件无需过多的代码就可以很方便的为一个对象绑定mousewheel事件。

查看demo

相关资料

转载于:https://www.cnblogs.com/hcbin/archive/2010/10/30/1865287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值