javascript 滚轮事件总结

滚轮事件是一个非常有用的事件,在翻页或放大时,通常都用到它。但它在各浏览器中实现兼容是相对比较困难的,号称最标准的 FF ,用了一个私有实现 DOMMous
javascript滚轮事件总结
滚轮事件是一个非常有用的事件,在翻页或放大时,通常都用到它。但它在各浏览器中实现兼容是相对比较困难的,号称最标准的FF,用了一个私有实现DOMMouseScroll,而使用mousewheel的其他浏览器或多或少有点bug。我们先看各浏览器对它的支持程度吧。

 
 IE
 firefox
 safari
 chrome
 opera
 
window对象
 false
 true
 true
 true
 true
 
文档对象
 true
 true
 true
 true
 true
 
元素节点
 true
 true
 true
 true
 true
 


接着我们看一下,如何在火狐中实现滚轮事件的事件分派:

window.addEventListener("DOMMouseScroll",function(event){
 
  alert(event.type)
 


 

  alert(event.clientY)
 
},false);
 


 

var event = document.createEvent("MouseEvent");
 
//为了证明分派成功,特意将其clientY设为90
 


 

event.initMouseEvent("DOMMouseScroll",true, null, window,0,0,0,0,90,false,false,false,false,0,null);
 
window.dispatchEvent(event)
 


 

<!doctype html>

<html lang="zh-ch">

  <head>

    <meta charset="utf-8" />

    <meta content="IE=8" http-equiv="X-UA-Compatible"/>

    <title>mousewheel的事件分派 by 司徒正美</title>

 

    <script type="text/javascript">

 

      window.onload = function(){

 

        window.addEventListener("DOMMouseScroll",function(event){

          alert(event.type)

          alert(event.clientY)

        },false);

        var event = document.createEvent("MouseEvent");

        //为了证明分派成功,特意将其clientY设为90

        event.initMouseEvent("DOMMouseScroll",true, null, window,0,0,0,0,90,false,false,false,false,0,null);

        window.dispatchEvent(event)

 

      }

 

    </script>

    <style type="text/css">

 

    </style>

 

  </head>

  <body>

  </body>

</html>

运行代码

我们可以看到虽然其他标准浏览器也支持这个名为DOMMouseScroll的事件发派,但当我们手动滚动鼠标滑轮时,也只有FF有反应,弹出两个alert。对于其他标准浏览器,我们改用mousewheel试试。

window.addEventListener("mousewheel",function(event){
 
  alert(event.type)
 


 

  alert(event.clientX)
 
},false);
 


 

var event = document.createEvent("MouseEvent");
 
//为了证明分派成功,特意将其clientX设为120
 


 

event.initMouseEvent("mousewheel",true, null, window,0,0,0,120,0,false,false,false,false,0,null);
 
window.dispatchEvent(event)
 


<!doctype html>

<html lang="zh-ch">

  <head>

    <meta charset="utf-8" />

    <meta content="IE=8" http-equiv="X-UA-Compatible"/>

    <title>mousewheel的事件分派 by 司徒正美</title>

 

    <script type="text/javascript">

        window.addEventListener("mousewheel",function(event){

          alert(event.type)

          alert(event.clientX)

        },false);

        var event = document.createEvent("MouseEvent");

        //为了证明分派成功,特意将其clientX设为120

        event.initMouseEvent("mousewheel",true, null, window,0,0,0,120,0,false,false,false,false,0,null);

        window.dispatchEvent(event)

 

    </script>

    <style type="text/css">

 

    </style>

 

  </head>

  <body>

  </body>

</html>

运行代码

这个在FF的以外的标准浏览器见效,FF只能实现事件分派,不能实现手动触发。可以说,如果非原浏览器原生支持的事件类型,addEventListener是一概不理会的。

对于IE就简单得多了,它没有初始化事件的步骤,你也无法设置其属性,因为那是只读的,但可以设置自定义属性。

  window.onload = function(){
 
    document.attachEvent("onmousewheel",function(){
 


 

      var e = window.event;
 
      alert(e)
 


 

      alert(e.type)
 
      alert(e.aa)
 


 

    });
 
  var event = document.createEventObject();
 


 

  event.aa = "司徒正美"
 
 
 


 

  document.fireEvent("onmousewheel",event)
 
}
 


<!doctype html>

<html lang="zh-ch">

  <head>

    <meta charset="utf-8" />

    <meta content="IE=8" http-equiv="X-UA-Compatible"/>

    <title>mousewheel的事件分派 by 司徒正美</title>

 

    <script type="text/javascript">

     window.onload = function(){

        document.attachEvent("onmousewheel",function(){

          var e = window.event;

          alert(e)

          alert(e.type)

          alert(e.aa)

        });

      var event = document.createEventObject();

      event.aa = "司徒正美"

 

      document.fireEvent("onmousewheel",event)

    }

    </script>

    <style type="text/css">

 

    </style>

 

  </head>

  <body>

  </body>

</html>

运行代码

 

转自:it民工网[http://www.itminggong.com]
原文链接:http://itminggong.com/a/jishuwenzhang/_net/2011/0304/6540.html

 

 

 

 

 

 

说完事件分派,就到事件绑定部分。虽然现在只有 FF 在用 DOMMouseScroll ,但考虑到未来 FF 改用的 mousewheel 的可能,我们还是写个程序来检测其需要的事件类型吧。最后我们还要在回调函
 

说完事件分派,就到事件绑定部分。虽然现在只有FF在用DOMMouseScroll,但考虑到未来FF改用的mousewheel的可能,我们还是写个程序来检测其需要的事件类型吧。最后我们还要在回调函数中修正其滚动属性:

·         IE的属性名为detail,w3c那边为wheelDelta,现在统一为delta。

·         IE等往上滚一圈为120,往下滚一圈为-120。w3c那边往上滚一圈为-3,往下滚一圈为3,但opera9x系列却实现错误,与IE滚动方向一致,不过10后又修复。

·         safari早期版本,wheelDelta会出现浮点数的情况,我们需要自行取整。

var eventSupported = function( eventName,el ) {
 
  el = el || document.createElement("div");
 


 

  eventName = "on" + eventName;
 
  var isSupported = (eventName in el);
 


 

  if (el.setAttribute && !isSupported ) {
 
    el.setAttribute(eventName, "return;");
 


 

    isSupported = typeof el[eventName] === "function";
 
  }
 


 

  el = null;
 
  return isSupported;
 


 

};
 
 
 


 

var addEvent = function(obj,type,callback){
 
  if ( obj.addEventListener ) {
 


 

    obj.addEventListener( type, callback, false );
 
  } else if ( obj.attachEvent ) {
 


 

    obj.attachEvent( "on" + type, callback );
 
  }
 


 

}
 
var type = eventSupported("mousewheel") ? "mousewheel":"DOMMouseScroll";
 


 

//注意IE下window没有滚轮事件
 
var wheel = function(obj,callback){
 


 

  addEvent(obj, type,function(event){
 
    event = event || window.event;
 


 

    var delta = 0;
 
    if (event.wheelDelta) {
 


 

      delta = event.wheelDelta/120;
 
      //opera 9x系列的滚动方向与IE保持一致,10后修正
 


 

      if(window.opera && window.opera.version() < 10)
 
        delta = -delta;
 


 

    } else if (event.detail) {
 
      delta = -event.detail/3;
 


 

    }
 
    //由于事件对象的原有属性是只读,我们只能通过添加一个私有属性delta来解决兼容问题
 


 

    event.delta =  Math.round(delta); //修正safari的浮点 bug
 
    callback.call(obj,event);
 


 

  });
 
}
 


用法:

wheel(document,function(e){
 
  alert(e.delta)
 


 

});
 


<!doctype html>

<html lang="zh-ch">

  <head>

    <meta charset="utf-8" />

    <meta content="IE=8" http-equiv="X-UA-Compatible"/>

    <title>mousewheel的事件绑定 by 司徒正美</title>

 

    <script type="text/javascript">

      window.onload = function(){

          var eventSupported = function( eventName,el ) {

          el = el || document.createElement("div");

          eventName = "on" + eventName;

          var isSupported = (eventName in el);

          if (el.setAttribute && !isSupported ) {

            el.setAttribute(eventName, "return;");

            isSupported = typeof el[eventName] === "function";

          }

          el = null;

          return isSupported;

        };

 

        var addEvent = function(obj,type,callback){

          if ( obj.addEventListener ) {

            obj.addEventListener( type, callback, false );

          } else if ( obj.attachEvent ) {

            obj.attachEvent( "on" + type, callback );

          }

        }

        var type = eventSupported("mousewheel") ? "mousewheel":"DOMMouseScroll";

        //注意IE下window没有滚轮事件

        var wheel = function(obj,callback){

          addEvent(obj, type,function(event){

            event = event || window.event;

            var delta = 0;

            if (event.wheelDelta) {

              delta = event.wheelDelta/120;

              //opera 9x系列的滚动方向与IE保持一致,10后修正

              if(window.opera && window.opera.version() < 10)

                delta = -delta;

            } else if (event.detail) {

              delta = -event.detail/3;

            }

            //由于事件对象的原有属性是只读,我们只能通过添加一个私有属性delta来解决兼容问题

            event.delta =  Math.round(delta); //修正safari的浮点 bug

            callback.call(obj,event);

          });

        }

        var counterDelta = 0;

        wheel(document.getElementById("delta"),function(e){

          counterDelta += e.delta

          this.innerHTML = counterDelta + ": " + ( e.delta < 0 ? '向下滚' : '向上滚' );

        });

      }

    </script>

    <style type="text/css">

      body {

        padding:20px 100px;

      }

      a{

        color:#FFDEAD;

      }

      #delta {

        padding:10px;

        width: 100px;

        height: 100px;

        background:#4DC2F2;

        color:#FF8C00;

        font-weight:bolder;

      }

    </style>

 

  </head>

  <body>

    <h1><a href="http://www.cnblogs.com/rubylouvre/">mousewheel的事件绑定</a></h1>

    <div id="delta" >

      by 司徒正美

    </div>

 

  </body>

</html>

运行代码

<script type="text/javascript"> if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 57731; var cb_entryId = 1725462; var cb_blogApp = "rubylouvre"; var cb_blogUserGuid = "2e47a4b1-de3e-de11-9510-001cf0cd104b"; var cb_entryCreatedDate = '2010/5/1 2:28:00';
 

转自:it民工网[http://www.itminggong.com]
原文链接:http://itminggong.com/a/jishuwenzhang/_net/2011/0304/6541.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值