zoukankan      html  css  js  c++  java
  • JS事件学习 拖拽,鼠标键盘事件实例汇总

    • event对象:事件对象,应用在IE6-8及高版本的chrome浏览器,在低版本的chrome浏览器及Firefox中需要用到一个参数:ev,在调用函数时,系统就将这个参数传给函数;为了解决这个兼容问题,可以用一个“或”的表达式,例如:var oEvent=event||ev;,然后调用的时候,直接用oEvent就好了;
    • document:包含整个页面的内容,上至<!DOCTYPE html>,下至;如果需要给整个页面加点击事件,应该加在document上而不是body上,因为body的范围由它所包含的内容决定;
    • 事件流:最简单的一个事件流的例子——事件冒泡(一般会带来一些困扰,所以很多时候需要取消冒泡:通过事件对象来解决——oEvent.cancelBubble=true;,典型的例子为仿select下拉框);
    • 鼠标事件:鼠标坐标,clientX及clientY(表示的是可视区的坐标,所有如果有滚动的时候需要加上scrollTop和scrollLeft);
    • keyCode:表示键盘上按键的键码,按键事件为onkeydown及onkeyup;(按键卡顿现象:照顾特殊人群,但是会造成不好的影响,解决方案为将事件加上setInterval函数来将延迟给掩饰掉,按键抬起时清除定时器);
    • 其他属性:ctrlKey,shiftKey、altKey,使用的时候都需要结合事件对象,例如:oEvent.ctrlKey

    示例代码 1:

    知识点:事件的兼容性判断,split(),鼠标和键盘事件的使用,clientX,clientY鼠标移动时获取鼠标的位置

    (要求)

    1. 在输入框中输入任意字符;
    2. 鼠标点击enter或者直接用键盘enter;
    3. 移动鼠标就能按到效果,输入的字符越多,效果越明显;
    4. 如果未输入任何字符,那么将会提示输入;

    编写思路: 获取输入的内容,分割成一个一个DIV插入到页面中,每个Div按鼠标位置进行排列。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>demo</title>
    <style>
    * {
    margin: 0;
    padding: 0;
    }
    #playbord div {
    float: left;
    position: absolute;
    20px;
    height: 20px;
    }
    #playbord {
    position: fixed;
    left: 10px;
    top: 10px;
    }
    #enter {
    230px;
    margin: 60px auto;
    }
    </style>
    </head>
    <body>
    <div id='enter'>
    <input id='input' type="text" placeholder="Enter your telephone number or your QQ" />
    <input id='btn' type='button' value="Enter" />
    </div>
    <div id='playbord'></div>
    <script>
    window.onload=function (ev){
    var oInp=document.getElementById('input');
    var oBtn=document.getElementById('btn');
    var oPlay=document.getElementById('playbord');
    var aRus=[];

    function tab(ev){
    aRus=oInp.value.split('');

    if(aRus.length>0){
    for(var i=0;i<aRus.length;i++){
    var oDiv=document.createElement('div');
    oDiv.innerHTML=aRus[i]+' ';
    oPlay.appendChild(oDiv);

    };
    document.onmousemove=function (ev){
    var oEvent=event||ev;
    var aDiv=oPlay.children;
    for(var i=aDiv.length-1;i>0;i--){
    aDiv[i].style.left=aDiv[i-1].offsetLeft+15+'px';
    aDiv[i].style.top=aDiv[i-1].offsetTop+'px';
    }

    aDiv[0].style.left=oEvent.clientX+'px';
    aDiv[0].style.top=oEvent.clientY+'px';
    }
    }
    else {
    alert('Please Enter Something First~')
    }

    };

    oBtn.onclick=function (){
    tab(ev);
    };

    document.onkeydown=function (ev){
    var oEvent=event||ev;
    if(oEvent.keyCode==13){
    tab(ev);
    };
    };

    }
    </script>
    </body>
    </html>

      示例代码 2:

    拖拽:保证鼠标的位置及被拖动元素的相对位置不变,需要注意的点如下:

    1. 应该是只有杂鼠标按下之后才能移动,鼠标抬起时移动停止;
    2. 对于鼠标快速移动时可能移出元素范围带来的移动异常,将移动事件加在document上即可解决;
    3. 当移动出视窗时释放鼠标按键,仍然能够移动,为了解决这个问题,需要将鼠标释放按钮事件也加在document上;
    4. 在Firefox中拖拽空元素的时候会出现重影,这也是FF中的一种默认事件,可以用返回false的方法来组织这个bug;
    5. 被拖拽元素被拖出视窗范围,这时候就可以判断来阻止元素被拖出视窗;
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">	
        <title>demo</title>
        <style>
        * {
            margin: 0;
            padding: 0;
            }
            #move {
                 100px;
                height: 100px;
                background: red;
                position: absolute;
            }
        </style>
    </head>
        <body>
           <div id='move'></div>
    <script>
       window.onload=function (){
      var oDiv=document.getElementById('move');
           oDiv.onmousedown=function(ev){
               var oEvent = event || ev ;
               var disX=oEvent.clientX-oDiv.offsetLeft;
               var disY=oEvent.clientY-oDiv.offsetTop;
               
               document.onmousemove=function(ev){
                   var oEvent = event || ev ;
                   var h=oEvent.clientX-disX;
                   var v=oEvent.clientY-disY;
                   
                   if(h<0){
                       h=0;
                   }
                   else if(h>document.documentElement.clientWidth-oDiv.offsetWidth){
                       h=document.documentElement.clientWidth-oDiv.offsetWidth;
                   };
                   
                   if(v<0){
                       v=0;
                   }
                   else if(v>document.documentElement.clientHeight-oDiv.offsetHeight){
                       v=document.documentElement.clientHeight-oDiv.offsetHeight;
                   };
                   
                   oDiv.style.left=h+'px';
                   oDiv.style.top=v+'px';
               };
               
            document.onmouseup=function(){
                document.onmousemove=null;
               
            };
               return false;
           }
    }
    </script>
        </body>
    </html>
    

      练习实例 3:

      关键词:带框拖拽、自定义滚动条

    • 带框拖拽:预先设置一个样式,按下鼠标产生一个div并赋予样式,div的大小与框相同,位置与框相同,移动时只移动框,松开鼠标时才移动框,并且将产生的div移出;
    • 自定义滚动条:控制对象的大小、透明度、文字滚动等;

        知识点思路总结:带框主要是构建一个新的div来实现,新的div要和拖拽目标大小一样,拖拽的时候拖拽的是带边框的div,鼠标抬起后移除带框div,写入原div。  

    制作过程中出现了一些问题,比如offsetleft是相对于父容器来计算的,因此控制按钮拖拽的计算方法上和拖拽以body为父元素的div是差不多的。

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">	
        <title>demo</title>
        <style>
        #bar {
       600px;
      height: 20px;
      position: relative;
      margin: 20px auto;
      background: rgb(255, 234, 234);
    }
    #control {
       20px;
      height: 20px;
      position: absolute;
      background: rgb(255, 0, 0);
    }
    .frame {
      border: 1px dashed blue;
      position: absolute;
    }
    #box {
      position: absolute;
      background: rgb(12, 234, 0);
       0;
      height: 0;
    }
        </style>
    </head>
        <body>
           <div id='bar'>
      <div id='control'></div>
    </div>
    <div id='box'></div>
    <script>
      window.onload=function(){
         var oBar=document.getElementById('bar');
         var oControl=document.getElementById('control');
         var oBox=document.getElementById('box');
          oControl.onmousedown=function(ev){
              var oEvent=event ||ev;
              var disX=oEvent.clientX-oControl.offsetLeft;
              var scale=1/(oBar.offsetWidth-oControl.offsetWidth);
              document.onmousemove=function(ev){
                  var oEvent=event ||ev;
                  var h=oEvent.clientX-disX;
              if(h<0){
                 h=0
              }
              else if(h>oBar.offsetWidth-oControl.offsetWidth){
                  h=oBar.offsetWidth-oControl.offsetWidth;
              };
                      oControl.style.left=h+'px';
                  oBox.style.width=oControl.offsetLeft*scale*300+'px';
          oBox.style.height=oControl.offsetLeft*scale*300+'px';
          }
              document.onmouseup=function(){
                  document.onmousemove=null;
              };
              return false;
          };
          oBox.onmousedown=function(ev){
              var oEvent=event||ev;
        var disX=oEvent.clientX-oBox.offsetLeft;
        var disY=oEvent.clientY-oBox.offsetTop;
              var oFrame=document.createElement('div');
               oFrame.style.width=oBox.offsetWidth-2+'px';
        oFrame.style.height=oBox.offsetHeight-2+'px';
        oFrame.style.left=oBox.offsetLeft+'px';
        oFrame.style.top=oBox.offsetTop+'px';
              oFrame.className='frame';
              document.body.appendChild(oFrame);
              
              document.onmousemove=function(ev){
                  var oEvent= event || ev ;
                  var h=oEvent.clientX-disX;
                  var v=oEvent.clientY-disY;
                  
                  if(h<0){
                      h=0;
                  }
                  else if(h>document.documentElement.clientWidth-oFrame.offsetWidth){
            h=document.documentElement.clientWidth-oFrame.offsetWidth;
          };
                  if(v<0){
            v=0;
          }
          else if(v>document.documentElement.clientHeight-oFrame.offsetHeight){
            v=document.documentElement.clientHeight-oFrame.offsetHeight;
          };
                  oFrame.style.left=h+'px';
                  oFrame.style.top=v+'px';
              };
              document.onmouseup=function(){
                  document.onmousemove=null;
                  document.onmouseup=null;
                  
                  oBox.style.left=oFrame.offsetLeft+'px';
          oBox.style.top=oFrame.offsetTop+'px';
          document.body.removeChild(oFrame);
              };
              return false;
          }
      }
    </script>
        </body>
    </html>
    

      练习实例 4:

       QQ登陆面板。 主要知识点总结: 考虑兼容性,getClassName方法的封装。 时间冒泡和时间默认行为不同浏览器阻止方法的兼容,更换classname来达到变换div,span的目的,

    合理利用事件冒泡。代码会贴codepen的链接。

       练习实例 5:

      抽奖系统。键盘事件

      主要知识点记录:  keyDown 用户按下任意键时触发,如果按住不放会重复触发。keyPress 按字符键时触发。 keyUp 用户释放键盘上的键时触发。  keyCode属性确定按了什么键。

    立一个flag来做状态标志,方便切换状态。随机数的用法,Math floor和Math random。

      

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">	
        <title>demo</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            #gift{
                 200px;
                height: :60px;
                margin: 0 auto;
                padding-top: 30px;
                font-size: 24px;
                font-weight: bold;
                line-height: 24px;
                color:red;
                text-align: center;
            }
            .btn {
                190px;
                margin: 30px auto; 
            }
            .btn span {
                display: inline-block;
                margin-left: 20px;
                50px;
                height:30px;
                background: #036;
                border-radius: 7px;
                text-align: center;
                font-size:16px;
                line-height:30px;
                color: aliceblue;
                cursor: pointer;
            }
        </style>
    </head>
        <body>
            <div id="gift">
                点击开始抽奖!
            </div>
            
            <div class="btn">
                <span id="start">开始</span>
                <span id="stop">停止</span>
            </div>
    <script>
        window.onload=function(){
            var giftList=["100元","iphone","ipad2","watch","小汽车","谢谢惠顾"];
            var gift=document.getElementById('gift');
            var btn1=document.getElementById('start');
            var btn2=document.getElementById('stop');
            var time=null;
            var flag=0;
            btn1.onclick=goGift;
            btn2.onclick=stopGift;
           document.onkeyup=function(e){
               e= e ||window.event;
               if(e.keyCode==13){
                   if(flag==0){
                       goGift();
                       flag=1;
                   }
                   else{
                       stopGift();
                       flag=0;
                   }
               }
           }     
                
           function goGift(){
               btn1.style.background='gray';
                clearInterval(time);
                 time=setInterval(function(){
                    var context=giftList[Math.floor(Math.random()*giftList.length)];
                    gift.innerHTML=context;
                },30);
           }     
            function stopGift(){
                btn1.style.background='#036';
                clearInterval(time);
            }
        }
    </script>
        </body>
    </html>
    

      

  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/oldchicken/p/6429159.html
Copyright © 2011-2022 走看看