javascript的鼠标事件

送分小仙女□ 提交于 2020-11-09 06:15:04
javascript的鼠标事件 是个比较庞大的家族。常见的有以下8个:

  • mousedown:鼠标的键钮被按下。
  • mouseup:鼠标的键钮被释放弹起。
  • click:单击鼠标的键钮。
  • dbclick:鼠标的键钮被按下。
  • contextmenu :弹出右键菜单。
  • mouseover:鼠标移到目标的上方。
  • mouseout:鼠标移出目标的上方。
  • mousemove:鼠标目标的上方移动。

mousedown事件与mouseup事件可以说click事件在时间上的细分,顺序是mousedown => mouseup => click。因此一个点击事件,通常会激发几个鼠标事件。
有了它们,我们可以做许多事,但对于高层次的应用(如游戏)是显然不够的,于是鼠标事件的点击事件又根据究竟是点左键还是右键进行细分。在DOM2.0中,W3C对鼠标事件作了现范,鼠标事件被解析为MouseEvent(我们可以用e.constructor == MouseEvent来判断其是否为鼠标事件,是左键点击还是右键点击由它的一个叫button的属性判定。以下就是W3C的标准现范:
0:按下左键
1:按下中键(如果有的话)
2:按下右键
当然微软是不会妥协的,因为e.button本来就是微软最先实现的,网景用的是e.which,但相对而言,微软的复杂多了。
0:没有键被按下
1:按下左键
2:按下右键
3:左键与右键同时被按下
4:按下中键
5:左键与中键同时被按下
6:中键与右键同时被按下
7:三个键同时被按下
更详细的情况见下表。
<script type="text/javascript">
  var checkevents = function(){
    var demo = document.getElementById("mouse");
    var ex = document.getElementById("explanation");
    demo.onclick = function(){
      ex.style.display = "block";
      ex.innerHTML += "click<br />"
    }
    demo.ondbclick = function(){
      ex.style.display = "block";
      ex.innerHTML += "dbclick<br />"
    }
    demo.onmouseup = function(){
      ex.style.display = "block";
      ex.innerHTML += "mouseup<br />"
    }
    demo.onmousedown = function(){
      ex.style.display = "block";
      ex.innerHTML += "mousedown<br />"
    }
    demo.oncontextmenu = function(){
      ex.style.display = "block";
      ex.innerHTML += "contextmenu<br />"
    }
    
  }
   var clearcontent = function(){
   var reset = document.getElementById("clearcontent");
   var ex = document.getElementById("explanation");
    reset.onclick = function(){
      ex.innerHTML = '';
      ex.style.display = "none";
    }
  }
  window.onload = function(){
    clearcontent();
    checkevents();
  };
</script>
<div id="mouse" style="width:500px;height:200px;background:#E8FFE8;border:2px solid #336699;">
请在这里点击,测试一个点击到底捆绑了多少种鼠标事件?!
</div>
<p><button type="button" id="clearcontent">清空</button></p>
<div id="explanation" style="width:500px;border:2px solid #336699;display:none;"></div>

运行代码 复制代码 另存代码  提示:您可以先修改部分代码再运行

  1. var mouseEvent = function(){
  2.     var arg = arguments[0],
  3.     el = arg.el || document,
  4.     leftfn = arg.left || function(){},
  5.     rightfn = arg.right || function(){},
  6.     middlefn = arg.middle || function(){},
  7.     buttons = {};
  8.     el.onmousedown = function(e){
  9.       e = e || window.event;
  10.       if(!+"\v1"){
  11.         switch(e.button){
  12.           case 1:buttons.left = true; break;
  13.           case 2:buttons.right = true; break;
  14.           case 4:buttons.middle = true; break;
  15.         }
  16.       }else{
  17.         switch(e.which){
  18.           case 1:buttons.left = true;break;
  19.           case 2:buttons.middle = true; break;
  20.           case 3:buttons.right = true;break;
  21.         }
  22.       }
  23.       if(buttons.left){
  24.         leftfn();
  25.       }else if(buttons.middle){
  26.         middlefn();
  27.       }else if(buttons.right){
  28.         rightfn();
  29.       }
  30.       buttons = {
  31.         "left":false,
  32.         "middle":false,
  33.         "right":false
  34.       };
  35.     }
  36.   }
复制代码

它接受一个哈希参数,都是可选项。哈希的el为要绑定鼠标事件的元素,left为点击左键激发的事件,其他两个类推。用法如下:
  1.    var el = document.getElementById("mouse");
  2.     var ex = document.getElementById("explanation");
  3.     var left = function(){
  4.       ex.innerHTML = "左键被按下";
  5.     }
  6.     var right = function(){
  7.       ex.innerHTML = "右键被按下";
  8.     }
  9.     mouseEvent({el:el,left:left,middle:null,right:right});

复制代码

<div id="mouse2" style="width:500px;height:200px;background:#E8FFE8;border:2px solid #336699;">

请在这里点击,测试左中右鼠标键绑定函数

</div>

<br />

<div id="explanation2" style="width:500px;border:2px solid #336699;">&nbsp;</div>

<script type="text/javascript">

   var mouseEvent = function(){

    var arg = arguments[0],

    el = arg.el || document,

    leftfn = arg.left || function(){},

    rightfn = arg.right || function(){},

    middlefn = arg.middle || function(){},

    buttons = {};

    el.onmousedown = function(e){

      e = e || window.event;

      if(!+"\v1"){

        switch(e.button){

          case 1:buttons.left = true; break;

          case 2:buttons.right = true; break;

          case 4:buttons.middle = true; break;

        }

      }else{

        switch(e.which){

          case 1:buttons.left = true;break;

          case 2:buttons.middle = true; break;

          case 3:buttons.right = true;break;

        }

      }

      if(buttons.left){

        leftfn();

      }else if(buttons.middle){

        middlefn();

      }else if(buttons.right){

        rightfn();

      }

      buttons = {

        "left":false,

        "middle":false,

        "right":false

      };

    }

  }

  var checkeventbutton = function(){

    var el = document.getElementById("mouse2");

    var ex = document.getElementById("explanation2");

    var left = function(){

      ex.innerHTML = "左键被按下";

    }

    var middle = function(){

      ex.innerHTML = "中键被按下";

    }

    var right = function(){

      ex.innerHTML = "右键被按下";

    }

    mouseEvent({el:el,left:left,middle:middle,right:right});

  }

  window.onload = function(){

    checkeventbutton();

  };

</script>

运行代码 复制代码 另存代码  提示:您可以先修改部分代码再运行


此外,通过鼠标在网页上的点击,我们还可以获得许多有用的参数,如获得当前鼠标的坐标。我们根据其参照物的不同,以下几套坐标系。一套是以当前浏览器的可视区为参照物(clientX, clientY),另一套是以显示器的屏幕为参照物(screenX, screenY)。此外微软还有一套坐标系(x,y),它是相对于触发事件的对象的offsetParent的,火狐有另一套坐标系(pageX, pageY),它是相对于当前网页的。我们可以通过如下函数来获得鼠标在网页的坐标。
  1. var getCoordInDocument = function(e) {
  2.     e = e || window.event;
  3.     var x = e.pageX || (e.clientX +
  4.       (document.documentElement.scrollLeft
  5.       || document.body.scrollLeft));
  6.     var y= e.pageY || (e.clientY +
  7.       (document.documentElement.scrollTop
  8.       || document.body.scrollTop));
  9.     return {'x':x,'y':y};
  10.   }

复制代码


<script type="text/javascript">

  var getCoordInDocumentExample = function(){

    var coords = document.getElementById("coords");

    coords.onmousemove = function(e){

      var pointer = getCoordInDocument(e);

      var coord = document.getElementById("coord");

      coord.innerHTML = "X,Y=("+pointer.x+", "+pointer.y+")";

    }

  }

 

  var getCoordInDocument = function(e) {

    e = e || window.event;

    var x = e.pageX || (e.clientX +

      (document.documentElement.scrollLeft

      || document.body.scrollLeft));

    var y= e.pageY || (e.clientY +

      (document.documentElement.scrollTop

      || document.body.scrollTop));

    return {'x':x,'y':y};

  }

  window.onload = function(){

     getCoordInDocumentExample();

 };

</script>

<div id="coords" style="width:500px;height:200px;background:#F2F1D7;border:2px solid #336699;">

请在这里移动鼠标。

</div>

<br />

<div id="coord" style="width:500px;border:2px solid #336699;">&nbsp;</div>

运行代码 复制代码 另存代码  提示:您可以先修改部分代码再运行



至于mouseover,mousemove,mouseout没有什么好说,并且无浏览器差异。我们来看鼠标滚轮事件,这个差异很严重。IE、Safari、 Opera 、chrome是mousewheel事件,Firefox是DOMMouseScroll事件。事件属性方面,IE等是event. wheelDelta,Firefox是event. detail。IE等往上滚一圈为120,往下滚一圈为-120。Firefox往上滚一圈为-3,往下滚一圈为3。我们可以构造一个函数来削除它们的差异。
  1.   var mouseScroll = function(fn){
  2.     var roll = function(){
  3.       var delta = 0,
  4.       e = arguments[0] || window.event;
  5.       delta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3;
  6.       fn(delta);//回调函数中的回调函数
  7.     }
  8.     if(/a/[-1]=='a'){
  9.       document.addEventListener('DOMMouseScroll', roll, false);
  10.     }else{
  11.       document.onmousewheel = roll;
  12.     }
  13.   }
复制代码

此函数接受一函数作为参数,如:
  1.   mouseScroll(function(delta){
  2.       var obj = document.getElementById('scroll'),
  3.       current = parseInt(obj.offsetTop)+(delta*10);
  4.       obj.style.top = current+"px";
  5.     });

复制代码

<script type="text/javascript">

  var $ = function(id){ return document.getElementById(id)}

 

  window.onload = function(){

    mouseScroll(function(delta){

      var obj = $('scroll'),

      current = parseInt(obj.offsetTop)+(delta*10);

      obj.style.top = current+"px";

    });

  }

 

  var mouseScroll = function(fn){

    var roll = function(){

      var delta = 0,

      e = arguments[0] || window.event;

      delta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3;

      fn(delta);//回调函数中的回调函数

    }

    if(/a/[-1]=='a'){

      document.addEventListener('DOMMouseScroll', roll, false);

    }else{

      document.onmousewheel = roll;

    }

  }

 

</script>

<style title="text/css">

  #scroll {

    color:#fff;

    background:#369;

    width:70px;

    height:70px;

    position:absolute;

    left:500px;

    top:200px;

  }

</style>

 

<div id="scroll">能用鼠标移动的方块</div>

运行代码 复制代码 另存代码  提示:您可以先修改部分代码再运行

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!