来源: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

相关资料

  • The onmousewheel event of JavaScript
  • onmousewheel Event
  • Mouse wheel programming in JavaScript

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

[JS] - onmusewheel事件(兼容IE,FF)相关推荐

  1. [JS] - onmusewheel事件(兼容IE,FF,opera,safari,chrome)

    来源:http://www.denisdeng.com/?p=685 相信用户在浏览Google Map 时,都注意到向上或向下滚动鼠标可以使地图放大或缩小.其实,对于鼠标滚动我们并不陌生.但要给一个 ...

  2. js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载...

    js添加事件.移除事件.阻止冒泡.阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 网上有关这方面的代码比较多而乱,这里整理一下并加以改进. 添加事件 01    var addEvent = ...

  3. JS获取鼠标位置,兼容IE FF

    JS获取鼠标位置,兼容IE FF 由于Firefox和IE等浏览器之间对js解释的方式不一样,firefox下面获取鼠标位置不能够直接使用clientX来获取.网上说的一般都是触发mousemove事 ...

  4. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

  5. JS的事件对象和事件冒泡

    2019独角兽企业重金招聘Python工程师标准>>> 1.事件对象 js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源.事件发生时的鼠标位置.事件按键等. 事件对象 ...

  6. CSS 单行溢出文本显示省略号...的方法(兼容IE FF)(转)

    CSS 单行溢出文本显示省略号...的方法(兼容IE FF)(转) html代码: <div> <p><span>CSS Web Design 我爱CSS-Web标 ...

  7. grayscale实现全站及局部变黑的效果 – 兼容IE/FF等浏览器

    grayscale实现全站及局部变黑的效果 – 兼容IE/FF等浏览器 时间:11-11-10所属栏目:前端效果 来源: james.padolsey.com 点击:470次 大小:0.04 MB 下 ...

  8. js中事件捕获和事件冒泡

    全栈工程师开发手册 (作者:栾鹏) js系列教程8-事件操作全解 js中事件捕获和事件冒泡 其实不仅在js中,在面向对象的编程语言中或多或少涉及到这个问题.js编程的事件全解,你可以到我的主页,这里给 ...

  9. 彻底弄懂JS的事件冒泡和事件捕获

    原文地址为: 彻底弄懂JS的事件冒泡和事件捕获 在学校,听老师讲解事件冒泡和事件捕获机制的时候跟听天书一样,只依稀记得IE使用的是事件冒泡,其他浏览器则是事件捕获.当时的我,把它当成IE浏览器兼容问题 ...

最新文章

  1. nginx怎么轮询两台php,Nginx 配置轮询分流-实现负载均衡【测试通过】
  2. Android中使用Notification在状态栏上显示通知
  3. 原来还有dynamic这东西。
  4. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(7)我用函数写了个特洛伊木马
  5. Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
  6. 【Python】TensorBoard的启动问题
  7. 618买手机哪家强?苹果官方也来打折促销了
  8. js技术要点---JS 获取网页源代码
  9. python数字运算程序_python03 一些简单的数字运算
  10. 【Java小工匠聊密码学】--对称加密--DES
  11. win10自动连接WIFI的批处理文件
  12. java学习之路2--简单工厂模式实现饮料自动贩卖机
  13. WeChat基础 senparc公众平台搭建
  14. CV——基于Stitcher类实现图片拼接
  15. 21天学会c++(英汉对照,个人翻译,水平有限,供参考)-------第2天
  16. java求最大公约数_java求最大公约数(分解质因数)
  17. HEP-DH车载一氧化碳报警器
  18. 物联网家电第一股,想离开小米的云米现在有多少实力?
  19. 解决:npm ERR! code ELIFECYCLE npm ERR! errno 1
  20. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(经典案例—利用自由聚光灯制作筒灯效果效果)图文教程

热门文章

  1. MyBatis学习笔记(四) 注解
  2. Ubuntu下GTK的安装、编译和测试
  3. RSA2013系列(1):中国成为热点
  4. 在Quartus下仿真FIFO的读写
  5. 与Android数据库一起工作
  6. python 企业微信群机器人_企业微信群机器人应用:使用python从网站抓取行业资讯并定时推送...
  7. 通讯软件通常要哪几个端口_您通常打开几个浏览器标签?
  8. 开源linux_15本书(适合(希望)喜欢Linux和开源的孩子)
  9. 55种数据可视化开源工具_通过开源工具增强学生能力的15种方法
  10. 决策者根据什么曲线做出决策_如何在开放社区中做出品牌决策