鼠标经过子元素触发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 相关文章推荐
firefox下对ajax的onreadystatechange的支持情况分析
Dec 14 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
Sep 05 Javascript
JS脚本defer的作用示例介绍
Jan 02 Javascript
js数组与字符串的相互转换方法
Jul 09 Javascript
学习JavaScript正则表达式
Nov 13 Javascript
跟我学习javascript的循环
Nov 18 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
Jul 10 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 29 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP Pear 安装及使用
2009/03/19 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
python实现用户管理系统
2018/01/10 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
对python中的logger模块全面讲解
2018/04/28 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
Python reversed函数及使用方法解析
2020/03/17 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
物流管理应届生求职信
2013/11/07 职场文书
KTV的创业计划书范文
2014/02/02 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
团日活动总结怎么写
2014/06/25 职场文书
房产协议书范本2014
2014/09/30 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript