• 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视频课程与浅吟清唱的简书博客。

  • 相关阅读:
    Python pandas 入门 05 JSON
    Python matplotlib 画图入门 07 散点图
    Python matplotlib 画图入门 06 绘制多图
    Python pandas 入门 04 CSV 文件
    Python pandas 入门 01 安装
    Python 入门示例系列 35 迭代器与生成器
    Python matplotlib 画图入门 03 绘图线
    Python pandas 入门 目录
    Python 零散知识点琐碎知识
    Python numpy 入门系列 目录
  • 原文地址:https://www.cnblogs.com/wangwg1994/p/7881894.html
Copyright © 2020-2023  润新知