鼠标事件
鼠标点击左键 并且鼠标抬起时触发
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没有任何意义(就看你的代码那个靠前就先执行谁)
那DOM
0级事件在事件处理模型的顺序是??
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级事件');
};
这些DOM
0级事件都相当于false
(在冒泡阶段定义了回调函数)都会在冒泡阶段触发的
结论:DOM
0级事件都是在冒泡阶段触发
捕获阶段和冒泡阶段解析突图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
事件对象上储存的常用信息对比图