博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JS] - onmusewheel事件(兼容IE,FF,opera,safari,chrome)
阅读量:6618 次
发布时间:2019-06-25

本文共 3364 字,大约阅读时间需要 11 分钟。

来源:

 

相信用户在浏览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.xif(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 browsersdocument.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.xif(obj.attachEvent) //if IE (and Opera depending on user setting)obj.attachEvent("on"+mousewheelevt, handler, useCapture);elseif(obj.addEventListener) //WC3 browsersobj.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]);}}

 其他一些onmousewheel的用法

  
滚轮取值效果 -http://www.jb51.net/

(IE/Opera)

注:“window.onmousewheel=document.onmousewheel”在chrome,opera,safari中会触发两次事件,可检测浏览器来区分。ie下仅支持“document.onmousewheel”事件。

 

IE/Opera属于同一类型,使用attachEvent即可添加滚轮事件。

 

/*IE注册事件*/ 

if(document.attachEvent){ 
document.attachEvent('onmousewheel',scrollFunc); 
}

 

Firefox使用addEventListener添加滚轮事件

 

/*Firefox注册事件*/ 

if(document.addEventListener){ 
document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}

Safari与Chrome属于同一类型,可使用HTML DOM方式添加事件 

window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome 
其中除Firefox外其余均可使用HTML DOM方式添加事件,因此添加事件使用以下方式

/*注册事件*/ 

if(document.addEventListener){ 
document.addEventListener('DOMMouseScroll',scrollFunc,false); 
}//W3C 
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome

 

也可以这样

if(document.attachEvent){document.attachEvent("on"+mousewheel, scrollFunc)}//ie

if(document.addEventListener){document.addEventListener(mousewheel, scrollFunc, false)}//Opera/Chrome/safari

判断滚轮向上或向下在浏览器中也要考虑兼容性,现在五大浏览器(IE、Opera、Safari、Firefox、Chrome)中Firefox 使用detail,其余四类使用wheelDelta;两者只在取值上不一致,代表含义一致,detail与wheelDelta只各取两个 值,detail只取±3,wheelDelta只取±120,其中正数表示为向上,负数表示向下。

 

var scrollFunc=function(e){ 

e=e || window.event;
if(e.wheelDelta){alert(e.wheelDelta);//IE/Opera/Chrome ±120

}

else if(e.detail){alert(e.detail)//Firefox ±3 

}

 

转载于:https://www.cnblogs.com/huangyong8585/archive/2012/11/14/2770114.html

你可能感兴趣的文章
java JSplitPane设置比例
查看>>
批量操作Windows域用户
查看>>
shell脚本 接受用户参数 记录一下
查看>>
健脾祛湿的中成药有哪些?
查看>>
IIS下支持下载.exe文件
查看>>
CXF WebService Hello World
查看>>
市场调研报告:企业级信息防泄漏大趋势
查看>>
济南企业短信平台的价格如何?
查看>>
requirejs
查看>>
php printf() 输出格式化的字符串
查看>>
VS2013下的64位与32位程序配置
查看>>
浅谈C中的指针和数组(二)
查看>>
SSM+Maven+IDEA增删改查
查看>>
微信小程序开发模板消息的时候 出现 errcode: 41028, errmsg: "invalid form id hint:
查看>>
2001年日语能力考试二级真题及答案
查看>>
移动端页面布局
查看>>
FUNCS.H中的函数声明
查看>>
让织梦CMS的后台编辑器支持优酷视频
查看>>
Python语言中round函数的一个疑惑
查看>>
使用msf对tomcat测试
查看>>