鼠标经过子元素触发mouseout,mouseover事件的解决方案


Posted in Javascript onJuly 26, 2015

我想实现的目标:当鼠标进入黑色框时,橙色框执行淡入动画;当黑色框范围移动的时候(即使经过粉色框,动画仍然不被触发);当鼠标移出的时候,橙色方块消失。

遇到的问题阐述:当鼠标移入黑色框的时候,橙色框执行淡入动画,但是当鼠标从黑色框经过粉色框的时候,橙色框就消失了,然后又执行一遍淡入动画。当鼠标从粉色框移出到黑色框的时候,橙色框的淡入动画又被执行。这不是我想要的。

初期代码:

<!DOCTYPE html>
<html>
<head>
<script src="jquery.js"></script>
 <meta charset="utf-8">
 <title>mouseover mouseout</title>
 <style type="text/css" media="screen">
   .parent{
 width:200px;
 height:200px;
 background:black;
}
.child{
 width:100px;
 height:100px;
 background:pink;
}
.a1{
 width:40px;
 height:40px;
 background:orange;
 display:none;
}
 </style>
</head>
<body>
<div class="parent">
 <div class="child"></div>
 <div class="a1"></div>
</div>
<script>
$('.parent').on('mouseover',function(e){ 
  $('.a1').show(1000);
 });
 $('.parent').on('mouseout',function(e){
  $('.a1').css('display','none');
 });
</script>
</body>
</html>

首先我们解释一下原因,为什么会出现这些问题。

当鼠标从黑色框移到粉色框的时候,此时黑色框的mouseout的被触发,又由于事件冒泡,黑色框的mouseover事件随即被触发,所以实际上,橙色框先消失,然后立即执行淡入动画。这也就是我们看到的过程。

当鼠标从粉色框移到黑色框的时候,此时黑色框的mouseout又被触发(因为不论鼠标穿过被选元素或其子元素,都触发 mouseover 事件),同时mouseover也被触发,所以又出现了再次执行淡入效果的过程。

方法一:用mouseleave/mouseout代替mouseover/mouseout【最佳方法】

先看一下mouseout&mouseover与mouseleave&mouseenter用法上的区别

mouseover与mouseenter

不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件。
只有在鼠标指针从元素外穿入被选元素(到元素内)时,才会触发 mouseenter 事件。

mouseout与mouseleave

不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。
只有在鼠标指针从元素内穿出被选元素(到元素外)时,才会触发 mouseleave 事件。

可以看一个简单的例子看看二者的区别

所以改进的代码可以为

<!DOCTYPE html>
<html>
<head>
<script src="jquery.js"></script>
 <meta charset="utf-8">
 <title>mouseover mouseout</title>
 <style type="text/css" media="screen">
   .parent{
 width:200px;
 height:200px;
 background:black;
}
.child{
 width:100px;
 height:100px;
 background:pink;
}
.a1{
 width:40px;
 height:40px;
 background:orange;
 display:none;
}
 </style>
</head>
<body>
<div class="parent">
 <div class="child"></div>
 <div class="a1"></div>
</div>
<script>
$('.parent').on('mouseenter',function(e){ 
  $('.a1').show(1000);
 });
 $('.parent').on('mouseleave',function(e){
  $('.a1').css('display','none');
 });
</script>
</body>
</html>

方法二:利用e.stopPropagation()阻止事件进一步传播

e.stopPropagation()会终止事件在传播过程的捕获、目标处理或起泡阶段进一步传播。调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点。

<!DOCTYPE html>
<html>
<head>
<script src="jquery.js"></script>
 <meta charset="utf-8">
 <title>mouseover mouseout</title>
 <style type="text/css" media="screen">
   .parent{
 width:200px;
 height:200px;
 background:black;
}
.child{
 width:100px;
 height:100px;
 background:pink;
}
.a1{
 width:40px;
 height:40px;
 background:orange;
 display:none;
}
 </style>
</head>
<body>
<div class="parent">
 <div class="child"></div>
  <div class="a1"></div>
</div>
 <script>
 $('.parent').on('mouseover',function(e){
   $('.a1').show(1000);
 });
 $('.parent').on('mouseout',function(e){
   $('.a1').css('display','none');
 });
 $('.child').on('mouseover',function(e){
  e.stopPropagation();
  $('.a1').css('display','block');
  //这是保证动画体的末状态不变
 });
 $('.child').on('mouseout',function(e){
  e.stopPropagation();
  //防止从粉色框移出到黑色框时再次触发其他事件
 })
 </script>
</body>
</html>

拓展思考:

1.如果子元素过多怎么办,难道每个都要去绑定e.stopPropagation()?

用jquery的一个选择器.children(),比如$('.parent').children()。获得匹配元素集合中每个元素的子元素。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
js文件中调用js的实现方法小结
Oct 23 Javascript
jQuery中调用WebService方法小结
Mar 28 Javascript
js实现格式化金额,字符,时间的方法
Feb 26 Javascript
jQuery版本升级踩坑大全
Jan 12 Javascript
canvas绘制七巧板
Feb 03 Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 Javascript
Angular中的interceptors拦截器
Jun 25 Javascript
JavaScript实现三级级联特效
Nov 05 Javascript
JavaScript实现一个简易的计算器实例代码
May 10 Javascript
微信小程序如何获取用户收货地址
Nov 27 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
浅谈vue限制文本框输入数字的正确姿势
Sep 02 Javascript
javascript中setTimeout使用指南
Jul 26 #Javascript
jquery不常用方法汇总
Jul 26 #Javascript
浅谈JavaScript中指针和地址
Jul 26 #Javascript
javascript的变量、传值、传址、参数之间关系
Jul 26 #Javascript
javascript实现动态导入js与css等静态资源文件的方法
Jul 25 #Javascript
javascript创建动态表单的方法
Jul 25 #Javascript
javascript文件加载管理简单实现方法
Jul 25 #Javascript
You might like
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
微信小程序 Storage更新详解
2019/07/16 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python中关于字符串对象的一些基础知识
2015/04/08 Python
简单实现python爬虫功能
2015/12/31 Python
Python常见异常分类与处理方法
2017/06/04 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
2020/06/22 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
为什么要做架构设计
2015/07/08 面试题
大学新生入学教育方案
2014/05/16 职场文书
拔河比赛口号
2014/06/10 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers