zoukankan      html  css  js  c++  java
  • js 获得点击的鼠标按钮键

    对于mousedown和mouseup来说,其event对象中存有一个button属性,表示按下或释放的按钮。DOM中属性有3个值:0表示主鼠标按钮,1表示中间的鼠标按钮,2表示次鼠标按钮(右键)。

    但是对于IE8及之前的版本来说,button中所存的值又是不同的:

          0:表示没有按下鼠标按钮

          1:表示按下主鼠标按钮

          2:表示按下次鼠标按钮

          3:表示同时按下主次鼠标按钮

          4:表示按下了中间的鼠标按钮

          5:表示同时按下了主鼠标按钮和中间鼠标按钮

          6:表示同时按下了中间和次鼠标按钮

          7:表示同时按下主,中间,次鼠标按钮

    可以发现,这些button属性和DOM中规定的相比复杂了许多,但是有很多都是不必要的。在通常情况下,同时按下两个及以上的鼠标按钮时很少见的,所以只要判断成其中一个就可以了。对于跨浏览器检测来说,通过映射来使返回的行为一致是很有必要的。在映射中,把主鼠标按钮作为优先选择,即在按下多个键是选用主键,其次是右键。

    由于两个属性都位于button,传统的直接检测button是否存在方法就会出现问题。这边使用了一个hasFeature。因为支持DOM规定的button的话,hasFeature('MouseEvents','2.0)返回的就应该是true。所以我们就可以使用hasFeature来检测。

     1 function getMouseButton(event){
     2     if(document.implementation.hasFeature('MouseEvents','2.0')){
     3         return event.button;
     4     }else{
     5         switch(event.button){
     6             case 0:
     7             case 1:
     8             case 3:
     9             case 5:
    10             case 7:
    11                 return 0;
    12                 break;
    13             case 2:
    14             case 6:
    15                 return 2;
    16                 break;
    17             case 4:
    18                 return 1;
    19                 break;
    20         }
    21     }
    22 }

    以下是上面这个函数的用例:

     1 function eventHandler(dom,type,fn){
     2     if(typeof dom.addEventListener != 'undefined'){
     3         dom.addEventListener(type,fn,false);
     4     }else if(typeof dom.attachEvent != 'undefined'){
     5         dom.attachEvent('on'+type,fn);
     6     }else{
     7         dom['on'+type] = fn;
     8     }
     9 }
    10 window.onload = function(){
    11     eventHandler(document.getElementById('testele'),'mouseup',function(event){
    12         event = event || window.event;
    13         var keyNum = getMouseButton(event),keyName;
    14         switch(keyNum){
    15             case 0:
    16                 keyName = 'Left';
    17                 break;
    18             case 1:
    19                 keyName = 'Middle';
    20                 break;
    21             case 2:
    22                 keyName = 'Right';
    23                 break;
    24         }
    25         document.getElementById('testele').innerHTML += keyName;
    26     });
    27 }

    这样就可以正确的判断出所有浏览器下按键的值了。例子完整代码如下:

     1 <html>
     2 <head>
     3 <script type="text/javascript">
     4     function eventHandler(dom,type,fn){
     5         if(typeof dom.addEventListener != 'undefined'){
     6             dom.addEventListener(type,fn,false);
     7         }else if(typeof dom.attachEvent != 'undefined'){
     8             dom.attachEvent('on'+type,fn);
     9         }else{
    10             dom['on'+type] = fn;
    11         }
    12     }
    13     function getMouseButton(event){
    14         if(document.implementation.hasFeature('MouseEvents','2.0')){
    15             return event.button;
    16         }else{
    17             switch(event.button){
    18                 case 0:
    19                 case 1:
    20                 case 3:
    21                 case 5:
    22                 case 7:
    23                     return 0;
    24                     break;
    25                 case 2:
    26                 case 6:
    27                     return 2;
    28                     break;
    29                 case 4:
    30                     return 1;
    31                     break;
    32             }
    33         }
    34     }
    35     window.onload = function(){
    36         eventHandler(document.getElementById('testele'),'mouseup',function(event){
    37             event = event || window.event;
    38             var keyNum = getMouseButton(event),keyName;
    39             switch(keyNum){
    40                 case 0:
    41                     keyName = 'Left';
    42                     break;
    43                 case 1:
    44                     keyName = 'Middle';
    45                     break;
    46                 case 2:
    47                     keyName = 'Right';
    48                     break;
    49             }
    50             document.getElementById('testele').innerHTML += keyName;
    51         });
    52     }
    53 </script>
    54 </head>
    55 <body>
    56     <div id="testele" style="padding:100px;background-color:silver;">click me!</div>
    57 </body>
    58 </html>
    View Code
  • 相关阅读:
    less中遇到的一些特殊的写法
    观察者模式
    发布订阅模式
    javascript中的函数
    关于js中this的理解和作用
    [Oracle]Oracle镜像安装及使用教程
    log4net日志配置
    过滤器
    .net core 处理 中文乱码
    Fromform
  • 原文地址:https://www.cnblogs.com/cyITtech/p/3559509.html
Copyright © 2011-2022 走看看