事件(鼠标事件、事件处理模型、事件对象)

鼠标事件

鼠标点击左键 并且鼠标抬起时触发

var oBox = document.getElementById('box');
        oBox.onclick = function(){//DOM0级事件
            console.log('我被点击了');
        };

鼠标右键点击了6下在这里插入图片描述

鼠标的任意键在按下时会触发

var oBox = document.getElementById('box');
        oBox.onmousedown = function(){//DOM0级事件
            console.log('鼠标在oBox上按下了,我检查到了');
        };

鼠标的任意键按了6下在这里插入图片描述

任意键是:左键,右键,中键(滚轮)

鼠标的任意键在按下时 并且抬起来时会触发

var oBox = document.getElementById('box');
        oBox.onmouseup = function(){//DOM0级事件
            console.log('鼠标在oBox上按下了,我检测到了');
        };

鼠标的任意键点击了23下在这里插入图片描述

onclick (鼠标左键点击一次)= onmousedown (鼠标任意键按下一次)+ onmouseup(鼠标任意键抬起一次)

当鼠标右键按下 并且抬起时触发

var oBox = document.getElementById('box');
        oBox.oncontextmenu = function(){//DOM0级事件
            console.log('鼠标右键点击了,我检测到了');
        };

鼠标的右键按了5下在这里插入图片描述

当鼠标进入到dom节点内部 就会触发事件处理函数

var oBox = document.getElementById('box');
        oBox.onmouseenter = function(){//DOM0级事件
            console.log('鼠标进来了,我检测到了mouseenter');
        };

鼠标进入oBox元素内部10会触发了10事件处理函数在这里插入图片描述
当鼠标进入到dom节点内部 就会触发事件处理函数

 var oBox = document.getElementById('box');
        oBox.onmouseover = function(){
            console.log('鼠标进来了,我检测到了mouseover');
        };

鼠标进入oBox元素内部6会触发了6次事件处理函数
在这里插入图片描述
当鼠标离开到dom节点内部 就会触发事件处理函数

 var oBox = document.getElementById('box');
        oBox.onmouseleave = function(){//DOM0级事件
            console.log('鼠标离开了,我检测到了  mouseleave');
        };

鼠标离开了oBox元素5会触发了5次事件处理函数
在这里插入图片描述
当鼠标离开到dom节点内部 就会触发事件处理函数

var oBox = document.getElementById('box');
        oBox.onmouseout = function(){
            console.log('鼠标离开了,我检测到了  mouseout');
        };

鼠标离开了oBox元素7会触发了7次事件处理函数
在这里插入图片描述
onmouseenter <–> onmouseleave 这是一组,鼠标进去元素时触发

onmouseover <–> onmouseout 这也是一组,鼠标离开元素时触发

当鼠标在dom节点内部移动时 就会持续触发事件处理函数

var oBox = document.getElementById('box');
        oBox.onmousemove = function(){
            console.log('鼠标在oBox里面移动了,我检测到了');
        };

鼠标在oBox元素上移动了21回在这里插入图片描述

事件处理模型

        #big{
            width: 300px;
            height: 300px;
            background-color: pink;
        }
        #small{
            width:200px;
            height: 200px;
            margin-left: 400px;
            background-color: blue;
        }
 <div id="big">
         <div id="small"></div>
     </div>
    <script>
        var oBig = document.getElementById('big');
        var oSmall = document.getElementById('small');
        oSmall.addEventListener('click',function(){
            console.log('small,被点击了');
        },false);
        oBig.addEventListener('click',function(){
            console.log('big,被点击了');
        },false);//事件监听器的第三个参数不写默认是false
    </script>

在这里插入图片描述
在这里插入图片描述

什么是事件处理模型??

当一个dom节点触发事件后,该事件会按照HTML结构在根节点和这个元素节点之间传播,路径上所有的节点都会收到该事件

那为什么点击蓝色区域会触发粉丝区域的事件处理函数呢???(事件冒泡阶段)

当我们点击蓝色盒子,会触发蓝色盒子的点击事件。当触发了点击事件,这个事件会按照HTML结构在根节点和这个元素节点之间传播,路径上所有的节点都会收到该事件

什么意思呢???在这里插入图片描述

当前蓝色盒子是small,点击small他会触发small的点击事件,small会找到他的父级big,big也会收到了点击事件,然后有因为big在JS中也添加了一个事件监听器监听一下click事件

因为事件传播机制,他是从small监听一下有没有点击事件,有就会传播到big没有就不会,然后监听了big有没有点击事件,然后监听出来有点击事件就会触发big的点击事件 (没有事件就不会触发,如果父级有点击事件那么,子级也会传播上父级的点击事件)

因为事件是从small开始往上冒泡,冒到big在冒到body在冒到html在冒到根节点document,这就叫做事件的冒泡(从small–>big–>body>html>document从子级冒到父级)

那么个body一个点击事件呢??

        var oBig = document.getElementById('big');
        var oSmall = document.getElementById('small');
        oSmall.addEventListener('click',function(){
            console.log('small,被点击了');
        },false);
        oBig.addEventListener('click',function(){
            console.log('big,被点击了');
        },false);
        document.body.addEventListener('click',function(){
            console.log('document.body 被点击了');
        },false);

在这里插入图片描述
为什么点击一个small出来了big和document.body??

点击蓝色的盒子,small肯定会触发他的点击事件处理函数,然后他会冒泡冒到他的父级big肯定会监听到他的事件处理函数,任何在冒泡到他的父级body肯定会监听到他的事件处理函数,然后冒泡到html,html没有点击事件处理函数那么肯定不会冒泡到html了

事件的冒泡就像河里面的鱼一样吐泡泡会往上吐泡泡,事件的冒泡就会往父级上找(false是指事件冒泡)

总结:

事件冒泡(默认是false):事件从dom节点开始传递到根节点 ==> 从下到上 (HTML的层级顺序)

那事件捕获的传播机制是什么呢?? (事件获取阶段)

        var oBig = document.getElementById('big');
        var oSmall = document.getElementById('small');
        oSmall.addEventListener('click',function(){
            console.log('small,被点击了');
        },true);
        oBig.addEventListener('click',function(){
            console.log('big,被点击了');
        },true);
        document.body.addEventListener('click',function(){
            console.log('document.body 被点击了');
        },true);

在这里插入图片描述
在这里插入图片描述那这个是什么意思呢??

因为把事件监听的第三个参数全换成了true,所有这3个回调函数都进入了事件捕获阶段

点里蓝色,因为第三个参数写的是true进入了事件捕获阶段,所以会从document—>html–>body–>big–>small,是跟上回的结果到过来的

因为事件监听器第3个参数写了true,所有都在事件捕获阶段会触发。

事件捕获是:(捕获了document事件–>捕获了html事件–>捕获了bdoy事件–>捕获了big事件–>捕获了samll事件)没有事件就不会捕获直接跳过(点击谁就捕获谁,不会往下捕获)

true和false表示事件处理函数在什么阶段(时候)会触发

  • false 表示事件处理函数在冒泡阶段会触发
  • true 表示事件处理函数在捕获阶段会触发

总结:

事件捕获(true):事件从根节点开始传递到dom节点 ==> 从上到下(HTML的层级顺序)

例子:

var oBig = document.getElementById('big');
        var oSmall = document.getElementById('small');
        oSmall.addEventListener('click',function(){
            console.log('small,冒泡阶段,我被点击了');
        },false);
        oBig.addEventListener('click',function(){
            console.log('oBig,冒泡阶段,我被点击了');
        },false);
        document.body.addEventListener('click',function(){
            console.log('document.body,冒泡阶段,被点击了');
        },false);
        oSmall.addEventListener('click',function(){
            console.log('small,捕获阶段,我被点击了');
        },true);
        oBig.addEventListener('click',function(){
            console.log('big,捕获阶段,被点击了');
        },true);
        document.body.addEventListener('click',function(){
            console.log('document.body,捕获阶段,被点击了');
        },true);

在这里插入图片描述
事件处理模型的顺序:先捕获阶段在冒泡阶段

点击的蓝色盒子不属于冒泡阶段和捕获阶段而是属于,事件触发。
如果点击的事件有冒泡阶段和捕获阶段,那么JS会看你的书写顺序那个靠前就会先执行谁,然后在执行另一个
在这里插入图片描述
事件处理模型是用来描述:他是事件捕获还是事件冒泡处理对应的事件处理函数的,监听器第3个参数的true和false规定了你的点击事件什么时候触发

当以没有点击一个点击事件时,false和true规定里面的回调函数触发的时间但是当你真正点击一个元素时true和false没有任何意义(就看你的代码那个靠前就先执行谁)

DOM0级事件在事件处理模型的顺序是??

var oBig = document.getElementById('big');
        var oSmall = document.getElementById('small');
        oBig.onclick = function(){
            console.log('oBig,DOM0级事件');
        };
        oBig.addEventListener('click',function(){
            console.log('oBig,冒泡阶段,我被点击了');
        },false);5
         document.body.addEventListener('click',function(){
             console.log('document.body 捕获阶段被点击了');
         },true)
        document.body.addEventListener('click',function(){
            console.log('document.body,冒泡阶段,被点击了');
        },false);6
        oSmall.onclick = function(){
            console.log('oSmall,DOM0级事件');
        };

在这里插入图片描述
这些DOM0级事件都相当于false(在冒泡阶段定义了回调函数)都会在冒泡阶段触发的

结论:DOM0级事件都是在冒泡阶段触发

捕获阶段和冒泡阶段解析突图2个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事件对象

       #big{
            width: 300px;
            height: 300px;
            background-color: pink;
        }
        #small{
            width:200px;
            height: 200px;
            margin-left: 400px;
            background-color: blue;
        }
        <div id="big">
             <div id="small"></div>
        </div>
 var oSmall = document.getElementById('small');
        oSmall.onclick = function(){
            console.log('heaven');
        };

在这里插入图片描述鼠标点击了3下

其实每一次给元素绑定一个对应的事件处理函数的时候,JS的内部程序他都会偷偷地往这个事件处理函数中传一个东西,这就是事件对象

什么是事件对象???

dom节点的事件被触发时,系统会向事件处理函数中传入一个对象,这个对象记录了事件触发时的重要信息,例如触发时的鼠标位置等等

那么怎么获取事件对象??

在IE8以上的高版本怎么获取事件对象??(IE8以上)

 var oSmall = document.getElementById('small');
        oSmall.onclick = function(e){//e是自定义的名字
            console.log(e);
        };//IE8以上高本版可以自定义对象名

在这里插入图片描述
对象:花括号开始,花括号结束,这个事件对象记录着事件触发时的重要信息

dom节点的事件被触发时,系统会向事件处理函数中传入一个对象,这个对象一般用e/event来表示

在IE的低版本中 window.event 存储着事件对象(IE8以下)

 var oSmall = document.getElementById('small');
        oSmall.onclick = function(){
            console.log(window.event);
        }

其他在事件对象上的操作和IE8以上的高版本一致
在这里插入图片描述
那么该兼容高版本和低版本的获取事件对象呢??

var oSmall = document.getElementById('small');
        oSmall.onclick = function(e){
            console.log(e = e||window.event);
        }//e = e||window.event方法兼容高低版本的浏览器

e = e||window.event方法兼容高低版本的浏览器
在这里插入图片描述
在这里插入图片描述
事件对象上储存的常用信息

e.clientX 鼠标距离浏览器左上角的水平距离e.clientY 鼠标距离浏览器左上角的竖直距离

var oSmall = document.getElementById('small');
        oSmall.onclick = function(e){
            console.log(e.clientX,e.clientY);
        };

在这里插入图片描述水平位置= 480 ,垂直位置= 115

e.offsetX 鼠标距离自身元素左上角的水平距离e.offsetY 鼠标距离自身元素左上角的竖直距离

 var oSmall = document.getElementById('small');
        oSmall.onclick = function(e){
            console.log(e.offsetX,e.offsetY);
        }

在这里插入图片描述水平位置= 76 ,垂直位置= 55

e.layerX 鼠标距离有定位属性父级元素的左上角的水平距离e.layerY 鼠标距离有定位属性父级元素的左上角的竖直距离(没有定位默认浏览器左上加的位置)

       #big{
            position: absolute;
            left: 20px;top: 20px;
            width: 300px;
            height: 300px;
            background-color: pink;
        }
 var oSmall = document.getElementById('small');
        oSmall.onclick = function(e){
            console.log(e.layerX,e.layerY);
        }

在这里插入图片描述水平位置= 577 ,垂直位置= 179

e.screenX 鼠标距离电脑左上角的水平距离e.screenY 鼠标距离电脑左上角的竖直距离

var oSmall = document.getElementById('small');
        oSmall.onclick = function(e){
            console.log(e.screenX,e.screenY);
        }

在这里插入图片描述水平位置= 1052 ,垂直位置= 204

事件对象上储存的常用信息对比图
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值