本文系统梳理JavaScript中DOM3定义的9种鼠标事件,包括mousedown、mouseup、click、dblclick、mouseover、mouseout、mouseenter、mouseleave及mousemove。重点解析事件触发顺序、冒泡特性差异,以及mouseenter/mouseover在后代元素交互时的不同表现,并提供jQuery hover API的应用说明。
相关阅读:
JavaScript事件学习小结(五)js中事件类型之鼠标事件
https://www.jb51.net/article/86259.htm
JavaScript事件学习小结(一)事件流
https://www.jb51.net/article/86261.htm
javaScript事件学习小结(四)event的公共成员(属性和方法)
https://www.jb51.net/article/86262.htm
JavaScript事件学习小结(二)js事件处理程序
https://www.jb51.net/article/86264.htm
JavaScript事件学习小结(三)js事件对象
DOM3定义的9种鼠标事件
鼠标事件
根据DOM3级事件规范,共定义了9种鼠标事件类型。
mousedown:当鼠标按钮(左键或右键)按下时触发该事件。
此事件无法通过键盘操作触发。
mouseup:当鼠标按钮被释放(弹起)时触发。
此事件无法通过键盘操作触发。
click:当用户单击鼠标左键或按下回车键时触发。这一机制对无障碍访问至关重要,确保onclick事件处理程序既能通过鼠标也能通过键盘执行。dblclick:当用户双击鼠标左键时触发。mouseover:当鼠标指针移动到目标元素上方时触发。需要注意的是,如果鼠标移入该元素的子元素,也会触发此事件。mouseout:当鼠标指针移出目标元素上方时触发。
mouseenter:当鼠标指针移入元素范围内时触发。该事件不冒泡,即鼠标移入其子元素时不会触发此事件。
mouseleave:当鼠标指针移出元素范围时触发。该事件不冒泡,即鼠标移出其子元素时不会触发此事件。
mousemove:当鼠标在元素内部移动时,会持续不断触发该事件。
此事件无法通过键盘操作触发。
注意:
必须在同一元素上相继触发mousedown和mouseup事件,才会触发click事件。只有当两个click事件相继发生时,才会触发dblclick事件。
如果取消了mousedown或mouseup中的任意一个,click事件将不会被触发。同样,如果直接或间接取消了click事件,dblclick事件也不会被触发。
事件触发顺序与取消机制
1、事件触发的顺序
示例:通过双击按钮,观察上述事件的触发过程。
<body>
<input id="btn" type="button" value="click"/>
<script>
var btn=document.getElementById("btn");
btn.addEventListener("mousedown",function(event){
console.log("mousedown");
},false);
btn.addEventListener("mouseup",function(){
console.log("mouseup");
},false);
btn.addEventListener("click", function () {
console.log("click");
},false);
btn.addEventListener("dblclick", function () {
console.log("dblclick");
},false);
</script>
</body>

mouseenter与mouseover的冒泡差异
2、mouseenter和mouseover的区别
主要区别:
mouseover事件会冒泡,这意味着当鼠标移入其子元素时,也会触发该事件。
mouseenter事件不冒泡,这意味着当鼠标移入其子元素时,不会触发该事件。
示例:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
#outer{
position: absolute;
width: 200px;
height: 200px;
top:0;
left: 0;
bottom:0;
right: 0;
margin: auto;
background-color: pink;
}
#inner{
position: absolute;
width: 100px;
height:100px;
top:50%;
left:50%;
margin-left: -50px;
margin-top: -50px;;
background-color: orange;
text-align: center;
line-height: 100px;
}
#outer,#inner{
border-radius:50%;
}
</style>
<script src="jquery-2.1.1.min.js"></script>
</head>
<body>
<body>
<div id="outer">
<div id="inner">
</div>
</div>
</body>
<script>
var parentDiv=document.getElementById("outer");
parentDiv.addEventListener("mouseover", function () {
console.log("父div的mouseover事件被触发");
},false);
//parentDiv.addEventListener("mouseenter", function () {
// console.log("父div的mouseenter事件被触发");
//},false);
//parentDiv.addEventListener("mouseout", function () {
// console.log("父div的mouseout事件被触发");
//},false);
//parentDiv.addEventListener("mouseleave", function () {
// console.log("父div的mouseleave事件被触发");
//},false);
</script>
</body>
</html>


注意:
mouseover通常对应mouseout,而mouseenter对应mouseleave。可以通过取消上述代码中的注释来查看具体效果。
在jQuery中,hover API是将mouseenter和mouseleave组合在一起使用的。
鼠标按键识别与事件选择建议
3、鼠标左键和右键
<script type="text/javascript">
document.onmousedown=function (ev)
{
var oEvent=ev||event;
alert(oEvent.button);// IE下鼠标的 左键是1 , 右键是2 ff和chrome下 鼠标左键是0 右键是2
};
</script>
4、mouseover和mousemove的区别
一般情况下使用mouseover即可,只有在特殊情况下才需要使用mousemove,因为mousemove消耗更多资源,例如需要监控鼠标坐标变化时。
以上所述是小编给大家介绍的JavaScript事件学习小结(五)js中事件类型之鼠标事件的相关知识,希望对大家有所帮助!