zoukankan      html  css  js  c++  java
  • [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

    相关资料

    个性签名:做要做好,做到不三不四不如不做。
  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/hcbin/p/1865287.html
Copyright © 2011-2022 走看看