• JS事件应用


    JS事件分为鼠标事件与键盘事件。想要保证事件被处罚一般要给document加事件监听。document可以理解为html标签外层的一个隐藏父标签,平时是看不到的,我们可以把它console.log一下,如下图:

    JS事件需要使用event对象,比如这样:

    document.onclick = function(ev)
    {
      alert(ev);
    }
    

     这样会弹出“object mouseevent”,即鼠标点击对象,但是IE8以下并不能识别ev,FF又不识别event,所以我们要简单的做一下兼容处理:

    var oEvent = ev||event; 
    //为防止事件冲突,还得给事件设置防止冒泡
    oEvent.cancelBubble = true;
    

    这样处理后直接用oEvent对象就可以了。cancelBubble翻译过来就是冒泡的意思。另外,jQuery的event.stopPropagation()也可以防止冒泡。

    鼠标点击事件最常见的应用就是获取鼠标的坐标,然后让元素跟随鼠标位置的变化进行移动。一个获取鼠标位置的简单例子:

    document.onclick = function(ev)
    {
      var oEvent = ev||event;
      alert(oEvent.clientX +"+"+oEvent.client.Y);       
    }
    

     值得注意的是,event.clientY获取到的坐标是基于可视区域的相对坐标值,如果我们把这个值添加给DOM元素的话,还必须要考虑到scrollTop的值,就像这样:

    document.onmouseover = function(ev)
    {
      var oEvent = ev||event;
      var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      document.title = "X="+oEvent.clientX + "px" +"Y="+oEvent.clientY + scrollTop + "px";
    }
    

     为了日后方便使用,我们可以将此方法封装成一个函数:

    function getPos(ev)
    {
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
        //以JSON的形式返回
        return {x:ev.clientX+scrollLeft ,y:ev.clientY+scrollTop};
    }
    var pos = getPos(oEvent);
    //获取X:
    console.log(pos.x);
    //获取y:
    console.log(pos.y);
    

     键盘的事件也比较简单,如下是将文本框里的值通过点击ctrl+enter键赋给textarea的一个小demo:

    <!doctype html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>键盘事件demo</title>
    </head>
    <body>
    <input type="text" id="txt1">
    <br>
    <textarea name="" id="txt2" cols="30" rows="10"></textarea>
    
    <script>
    var oTxt1 = document.getElementById("txt1");
    var oTxt2 = document.getElementById("txt2");
    oTxt1.onkeydown = function(ev)
    {
        var oEvent = ev||event;
        //oEvent.keyCode = oEvent.which
        if ( oEvent.keyCode == 13 && oEvent.ctrlKey)        //JS提供的方法有ctrlkey,shiftkey,altkey
        {
          oTxt2.value += oTxt1.value+"
    ";
          oTxt1.value = '';
        }
    };
    </script>
    
    </body>
    </html>
    

     最常见的按键事件应用就是按回车登录了,少点下鼠标操作很流畅。另外课程里还提到利用方向键控制元素移动的方法,不过长按按键本身是带有延迟的,因此控制元素移动的时候会在开始有轻微的卡顿,于是我找到了这篇博客:键盘控制div移动并且解决停顿问题(原生js)—— 浅吟清唱,大家可以去看一下,想法很精妙,下面直接放代码:

    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #move{
                position: absolute;
                top: 30px;
                 30px;
                height: 30px;
                background-color: #ff3b2d;
                z-index:99;
            }
        </style>
    </head>
    <body>
    <div id="move"></div>
    <script>
    
        window.onload = function(){
    
            //获取Div元素
            var oDiv = document.getElementById("move");
    
            //创建各个方向条件判断初始变量
            var left = false;
            var right = false;
            var top = false;
            var bottom = false;
    
            //当按下对应方向键时,对应变量为true
            document.onkeydown = function(ev){
                var oEvent = ev || event;
                var keyCode = oEvent.keyCode;
                switch(keyCode){
                    case 37:
                        left=true;
                        break;
                    case 38:
                        top=true;
                        break;
                    case 39:
                        right=true;
                        break;
                    case 40:
                        bottom=true;
                        break;
                }
            };
    
            //设置一个定时
            setInterval(function(){
    
                //当其中一个条件为true时,则执行当前函数(移动对应方向)
                if(left){
                    oDiv.style.left = oDiv.offsetLeft-10+"px";
                }else if(top){
                    oDiv.style.top = oDiv.offsetTop-10+"px";
                }else if(right){
                    oDiv.style.left = oDiv.offsetLeft+10+"px";
                }else if(bottom){
                    oDiv.style.top = oDiv.offsetTop+10+"px";
                }
            },20);
    
            //执行完后,所有对应变量恢复为false,保持静止不动
            document.onkeyup = function(ev){
                var oEvent = ev || event;
                var keyCode = oEvent.keyCode;
    
                switch(keyCode){
                    case 37:
                        left=false;
                        break;
                    case 38:
                        top=false;
                        break;
                    case 39:
                        right=false;
                        break;
                    case 40:
                        bottom=false;
                        break;
                }
            }
        }
    
    
    
    </script>
    </body>
    </html>
    

    以上。

    本课程内容整理自智能社的JS视频课程与浅吟清唱的简书博客。

  • 相关阅读:
    HDU1272---(并查集)简单应用
    HDU1232 畅通工程---(经典并查集应用)
    HDU 1877 又一版 A+B(进制转换)
    L1-020. 帅到没朋友
    L2-001. 紧急救援---(Dijkstra,记录路径)
    JVM Class字节码之三-使用BCEL改变类属性
    JVM Class详解之一
    Jvm原理剖析与调优之内存结构
    虚拟化的发展历程和实现原理——图文详解
    JVM学习笔记(四)------内存调优
  • 原文地址:https://www.cnblogs.com/wangwg1994/p/7881894.html
Copyright © 2020-2023  润新知