• JS事件02(鼠标事件、拖拽、focus和input事件、组织默认事件、按键事件、滚轮事件)


    鼠标事件

    <style>
        body{
            margin: 0;
        }
        .div0
        {
            100px;
            height:100px;
            
            position: relative; 
                left:100px; 
                top:800px;
            /* margin: 100px; */
            
        }
        .div1
        {
             50px;
            height: 50px;
            
            position: absolute;
            left:50px;
            top:50px;
            /* margin: 50px; */
        
        }
        .span0
        {
            display: none;
            
            position: absolute;
            padding: 0px 5px;
            border-radius: 50px;
            font-size: 12px;
            z-index: 999;
        }
    </style>
    <span class="span0">aaaaa</span>
    <div class="div0">
        <div class="div1"></div>
    </div>
    <script>
        /*  clientX: 33  距离可视区域左上角位置
            clientY: 31
    ​
            layerX: 28   如果目标对象是定位方式,值于offset相似
            layerY: 20   如果目标对象是非定位方式,
            // 取父容器的左上角位置,如果父容器未定位,继续向上取
    ​
            offsetX: 16  相对事件目标对象的左上角位置
            offsetY: 9
    ​
            movementX: 0  仅用于mousemove事件  这个值是鼠标移动时相对上次获取坐标的距离
            movementY: 0
    ​
            pageX: 28 相对页面顶端左上角位置
            pageY: 25
    ​
            screenX: 38  相对屏幕左上角位置
            screenY: 107
    ​
            x: 32   和clientX,clientY相同
            y: 33
    ​
            按下键点击鼠标时变为true
            altKey: false 
            ctrlKey: false
            metaKey: false
            shiftKey: false
    ​
            针对mousedown事件的属性,判断按下的键
                    左键    中键   右键
            button:  0     1       2
            buttons: 0     4       2
            which:   1     2       3
            */
    ​
        var div=document.querySelector(".div0");
        // div.addEventListener("mousedown",clickHandler);
        // div.addEventListener("mouseup",clickHandler);
        // div.addEventListener("click",clickHandler);
        // div.addEventListener("mouseover",clickHandler);
        // div.addEventListener("mouseout",clickHandler);
        // div.addEventListener("mouseenter",clickHandler);
        // div.addEventListener("mouseleave",clickHandler);
        // mouseover mouseout具有冒泡功能可以收到鼠标滑入滑出子元素的冒泡事件
        // mouseenter mouseleave仅对侦听的对象起到事件接收作用
        // div.addEventListener("mousemove",mouseHandler);
        // div.addEventListener("mouseover",mouseHandler);
        // div.addEventListener("mouseout",mouseHandler);
        div.addEventListener("contextmenu",mouseHandler);
        // var span0=document.querySelector(".span0");
    ​
        function clickHandler(e){
            console.log(e.type);
            // console.log(e.clientX,e.clientY)
        }
    ​
        /*  function abc(){
            console.log(e.clientX,e.clientY);
        } */
    ​
        /* 
            click  点击左键
            dblclick  双击左键
            mousedown  按下键
            mouseup    释放键
            mouseover  滑过
            mouseout   滑出
            mouseenter  进入
            mouseleave  离开
            mousemove  移动
            contextmenu 右键菜单
            */
    ​
            function mouseHandler(e){
                e.preventDefault();
                console.log(e);
            /*  switch(e.type){
                    case "mouseout":
                    span0.style.display="none";
                    break;
                    case "mouseover":
                    span0.style.display="inline-block";
                    case "mousemove":
                    span0.textContent="这是"+getComputedStyle(e.target).backgroundColor+"颜色";
                    span0.style.left=e.pageX+"px";
                    span0.style.top=e.pageY+"px";
                    break;
                } */
            }
        //  tooltip
    </script>

    拖拽

    var Utils=(function(){
    /* 
        拖拽方法
            拖拽元素
            参数:
                elem:被拖拽的HTML标签DOM元素   HTMLElement
                parentOut:是否不允许拖拽到容器外
                    类型 Boolean:true 不允许拖拽到父容器外
                                    false 允许拖拽到父容器外
                        Object  示例:{Number,height:Number};
                                width和height限制拖拽的范围
                                如果为0,该方向不能拖拽
            返回:无
    ​
            1、完成拖拽的起始侦听事件,当侦听在元素上按下mousedown事件时
                执行当前对象的函数mousedownHandler
            2、将当前对象存储在这个元素的obj属性中,用于在后面按下时调用
                到当前对象
            3、设置这个元素的定位为绝对定位
            4、设置document对象的属性是当前带入参数是否不允许拖拽到容器外这个值
                用来在后续中判断该元素是否允许拖拽脱离当前容器
        */
        dragElem:function(elem,parentOut){
            elem.obj=this;
            elem.style.position="absolute";
            document.parentOut=parentOut;
            elem.addEventListener("mousedown",this.mousedownHandler);
        },
        /* 
            鼠标按下键和鼠标移动,释放的事件函数
            参数:
                e  MouseEvent 鼠标对象 由鼠标事件自动创建该参数
            1、鼠标按下时
                鼠标按下时 this,e.currentTarget   针对标签元素  this->按下的标签元素
                    1、取消默认事件行为,可以解决拖拽时产生禁止拖拽图标
                    2、将当前按下鼠标左键相对元素左上角的坐标存储在document的对象属性X和y上
                    用于后面调用时使用
                    3、将当前this,也就是按下的元素存储在document对象属性div中
                    4、将当前Utils这个对象存在document对象属性obj中,用于后面的调用
                5、针对document侦听鼠标移动和释放事件,执行的函数是Utils对象,这个对象存在this.obj
                    也就是按下元素的obj属性
            2、鼠标移动时
                this,因为鼠标是侦听document上移动的事件,所以,this是document
                1、获取当前按下元素的父元素,this.div就是document.div,这个在按下时做了存储
                    并且求出它的父元素的范围矩形,这个返回矩形包括父元素的相对可视窗口的坐标和父元素宽高
                2、计算出x,y是当前鼠标移动位置相对当前元素父元素的左上角位置 
                3、判断 parentOut传入参数属性是不是允许拖拽到父元素外,如果是true,不允许拖拽到父元素外
                    如果是对象就需要设置拖拽的范围
                    如果是true,拖拽时禁止x和y小于0,限制右侧和下侧不出容器
                    如果时对象,限制不出对象宽高的范围,
                4、设置这个元素的位置是调整过后坐标
            3、鼠标释放时
                删除document上所有的mousemove事件和mouseup事件
        
        */
        mousedownHandler:function(e){
            // 1、事件函数中的this会覆盖普通对象中函数this的指向
            // 2、事件函数中,针对e.type事件类型所有对应的事件侦听对象才是this
    ​
            if(e.type==="mousedown"){
                e.preventDefault();
                document.x=e.offsetX;
                document.y=e.offsetY;
                document.div=this;
                document.obj=this.obj;
                document.addEventListener("mousemove",this.obj.mousedownHandler)
                document.addEventListener("mouseup",this.obj.mousedownHandler)
            }else if(e.type==="mousemove"){
                var left,top;
                var rect=this.div.parentElement.getBoundingClientRect();
                var x=e.clientX-this.x-rect.x;
                var y=e.clientY-this.y-rect.y;
                if(this.parentOut===true){
                    if(x<0) x=0;
                    if(x>=rect.width-this.div.offsetWidth)x=rect.width-this.div.offsetWidth;
                    if(y<0) y=0;
                    if(y>=rect.height-this.div.offsetHeight) y=rect.height-this.div.offsetHeight;
                }else if(typeof this.parentOut==="object"){
                    if(x<0) x=0;
                    if(x>=this.parentOut.width-this.div.offsetWidth)x=this.parentOut.width-this.div.offsetWidth;
                    if(y<0) y=0;
                    if(y>=this.parentOut.height-this.div.offsetHeight) y=this.parentOut.height-this.div.offsetHeight;
                    if(this.parentOut.width===0) x=0;
                    if(this.parentOut.height===0) y=0;
                }
                this.div.style.left=x+"px";
                this.div.style.top=y+"px";
            }else{
                document.removeEventListener("mousemove",this.obj.mousedownHandler)
                document.removeEventListener("mouseup",this.obj.mousedownHandler)
            }
        },
        dragOff:function(elem){
            elem.obj=null;
            document.obj=null;
            elem.removeEventListener("mousedown",this.mousedownHandler);
        }
    }
    })();

    焦距和Input事件

    <input type="text" id="input0" placeholder="用户名">
    <input type="text" id="input1">
    <script>
        /* 
            FocusEvent  焦距事件
                focus  汇聚焦距
                blur   失去焦距
                所有的表单元素,例如文本框
                超链接
                focus汇聚焦距的方式有点击,tab切换
        
        */
    ​
        var input0=document.querySelector("#input0");
        var input1=document.querySelector("#input1");
        input0.addEventListener("focus",focusHandler);
        input1.addEventListener("focus",focusHandler);
        input1.addEventListener("blur",focusHandler);
    ​
        function focusHandler(e){
            console.log(e);
            // e.relatedTarget  上次汇聚焦距的元素
        }
    ​
        // inputEvent  input事件
        var input0=document.querySelector("#input0");
        input0.addEventListener("input",inputHandler);
    ​
        function inputHandler(e){
            console.log(e);
            
                /*   e.data: "o"  输入的内容
                e.inputType: "insertText" 输入的类型  insertCompositionText
                                包括插入文本,删除文本,插入输入法文本,剪切粘贴文本等等
                e.isComposing: true   是否是输入法文本   
            */
            if(!isNaN(e.data)) input0.value=input0.value.replace(e.data,"");
        }
    ​
        // 节流
    ​
        var input0=document.querySelector("#input0");//拿到input0这个标签
        var ids;//定义一个ids计数器
        input0.addEventListener("input",inputHandler);//给input标签加一个事件监听
    ​
        function inputHandler(e){//当input事件发生时,执行这个函数
            if(ids!==undefined) return;//当ids有值时,即setTimeout创建后ids计数器有值,此时直接return 
            ids=setTimeout(function(){//如果未赋值,创建一个setTimeout
                clearTimeout(ids);//首先清除ids计数器
                ids=undefined;
                console.log(input0.value);//打印此次节流500ms后的input的值
            },500);
        }
    </script>

    阻止默认事件

    <style>
        div
        {
             100px;
            height: 100px;
            
        }
    </style>
    <form action="#">
        <input type="text" name="user">
        <input type="password" name="pass">
        <input type="submit">
        <input type="reset">
    </form>
    <div>askjdjksad</div>
    <img src="./img/1.png">
    <script>
        // 1、表单事件中的submit reset 使用阻止默认事件可以取消提交和重置
        /* var form=document.querySelector("form");
        form.addEventListener("submit",formHandler);
        form.addEventListener("reset",formHandler);
    ​
        function formHandler(e){
            e.preventDefault();        
        } */
    ​
        // 2、当使用contextmenu事件,取消鼠标右键菜单
        /* document.addEventListener("contextmenu",mouseHandler);
        function mouseHandler(e){
            e.preventDefault();      
        } */
    ​
        // 3、当针对元素拖拽时,元素内有文本,文本会被选中
        /* var div=document.querySelector("div");
        document.addEventListener("mousedown",mouseHandler);
    ​
        function mouseHandler(e){
            e.preventDefault();       
        } */
    ​
        // 4、图片拖拽时产生禁止拖拽图标
        /* var img=document.querySelector("img");
        img.addEventListener("mousedown",mouseHandler);
    ​
        function mouseHandler(e){
            e.preventDefault();
        } */
    </script>

    按键事件

    <style>
        textarea
        {
             800px;
            height: 400px;
        }
        input
        {
             600px;
        }
        div
        {
             500px;
            height: 400px;
            border:1px solid #000000;
            word-wrap: break-word;
        }
    </style>
    <!-- <textarea id="texts"></textarea><br>
    <input type="text" id="msg">
    <button>提交</button> -->
    <div></div>
    <script>
            /* 
                e.code: "KeyA"
                e.key: "a"
                e.keyCode: 65
                e.which: 65   */
                
        document.addEventListener("keydown",keyHandler);
        function keyHandler(e){
            console.log(e);
            
        }
    ​
        var texts,msg,bn
        init();
        function init(){
            texts=document.querySelector("#texts");
            msg=document.querySelector("#msg");
            bn=document.querySelector("button");
            bn.addEventListener("click",clickHandler);
            document.addEventListener("keydown",clickHandler);
        }
    ​
        function clickHandler(e){
            if(e.type!=="click" && e.type!=="keydown") return;
            if(e.keyCode && e.keyCode!==13) return
            if(msg.value.trim().length<1) return;
            texts.value+=msg.value+"
    ";
            msg.value="";
        } 
    ​
        // 富文本编辑器
        var div=document.querySelector("div");
        document.addEventListener("keydown",keyHandler);
        // document.addEventListener("keyup",keyHandler);
    ​
        function keyHandler(e){
            if(e.keyCode<48 || e.keyCode>57 && e.keyCode<65 || e.keyCode>90) return;
    ​
            div.innerHTML+=e.key;
        }
    </script>

    人物走路案例

    var actor,code;
    var bool=false,
        dic="",
        time=0,
        speed=1,
        num=0,
        x=0,
        y=0;
    ​
    init();
    function init(){
        actor=createActor();
        document.addEventListener("keydown",keyHandler);
        document.addEventListener("keyup",keyHandler);
        setInterval(animation,16);
    }
    ​
    function createActor(){
        var  actor=document.createElement("div");
        Object.assign(actor.style,{
            "32px",
            height:"32px",
            position:"absolute",
            left:0,
            top:0,
            backgroundImage:'url(./img/Actor01-Braver03.png)',
        });
        document.body.appendChild(actor);
        return actor;
    }
    ​
    // 37,38,39,40
    function keyHandler(e){
        bool=e.type==="keydown";
        code=e.keyCode;
        if(e.type==="keyup"){
            actor.style.backgroundPositionX="0px";
            time=0;
        }
    }
    ​
    function animation(){
        if(!bool) return;
    ​
        actorMove();
        actorAction();
    }
    ​
    function actorAction(){
        if(code<37 || code>40) return;
        time--;
        if(time>0)return;
        time=15;
        actor.style.backgroundPositionX=num++%4*-32+"px"
    }
    ​
    function actorMove(){
        switch(code){
            case 37:
            if(dic!=="left"){
                actor.style.backgroundPositionY="-33px";
                dic="left"
            }
                x-=speed;
            break;
            case 38:
            if(dic!=="top"){
                actor.style.backgroundPositionY="-99px";
                dic="top"
            }
                y-=speed;
            break;
            case 39:
            if(dic!=="right"){
                actor.style.backgroundPositionY="-66px";
                dic="right"
            }
                x+=speed;
            break;
            case 40:
            if(dic!=="bottom"){
                actor.style.backgroundPositionY="0px";
                dic="bottom"
            }
                y+=speed;
            break;
        }
        actor.style.left=x+"px";
        actor.style.top=y+"px";
    }

    滚轮事件

    /* 向上
    google和IE
    deltaX: -0
    deltaY: -100
    deltaZ: 0
    detail: 0
    wheelDelta: 120
    wheelDeltaX: 0
    wheelDeltaY: 120
    火狐
    e.detail: -3
    */
    var speed=0;
    window.addEventListener("mousewheel",wheelHandler);
    window.addEventListener("DOMMouseScroll",wheelHandler)
    ​
    function wheelHandler(e){
        if(e.type==="mousewheel"){
            speed=e.deltaY<0 ? -10 : 10; 
        }else if(e.type==="DOMMouseScroll"){
            speed=e.detail<0 ? -10 : 10;
        }
        console.log(speed);
    } 

     

  • 相关阅读:
    android 核心组件( 1 ) 常用布局, adapter, handler, UI
    Android 提高篇 6 之MediaPlayer
    Windows下获取Android系统源码
    Android入门学习笔记之人机用户界面
    Android的三种网络联接方式(URL / HttpURLConnection | HttpClient | InetAddress )
    界面开发的推荐色值, dip,px,pt,sp 的区别
    Android 提高 5 SurfaceView绘图容器的基本使用
    一些腾讯笔试题目
    Android提高篇2 之 Service就是后台程序
    Android提高篇1 之 BroadcastReceiver 应用程序间通信的手段
  • 原文地址:https://www.cnblogs.com/ananasfleisch/p/13378847.html
Copyright © 2020-2023  润新知