【原创】解决鼠标经过子元素触发mouseout,mouseover事件的问题

关键词:父子元素关系  mouseout  mouseover  事件  事件冒泡

初期代码:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <script src="jquery.js"></script>
 5   <meta charset="utf-8">
 6   <title>mouseover mouseout</title>
 7   <style type="text/css" media="screen">
 8       .parent{
 9   width:200px;
10   height:200px;
11   background:black;
12 }
13 .child{
14   width:100px;
15   height:100px;
16   background:pink;
17 }
18 .a1{
19   width:40px;
20   height:40px;
21   background:orange;
22   display:none;
23 }
24
25
26   </style>
27 </head>
28 <body>
29 <div class="parent">
30   <div class="child"></div>
31    <div class="a1"></div>
32 </div>
33
34
35
36
37
38  <script>
39 $(‘.parent‘).on(‘mouseover‘,function(e){
40
41
42     $(‘.a1‘).show(1000);
43
44   });
45
46   $(‘.parent‘).on(‘mouseout‘,function(e){
47
48
49     $(‘.a1‘).css(‘display‘,‘none‘);
50
51   });
52
53
54
55  </script>
56 </body>
57 </html>

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

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

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

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

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

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

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

mouseover与mouseenter

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

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

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

所以改进的代码可以为

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <script src="jquery.js"></script>
 5   <meta charset="utf-8">
 6   <title>mouseover mouseout</title>
 7   <style type="text/css" media="screen">
 8       .parent{
 9   width:200px;
10   height:200px;
11   background:black;
12 }
13 .child{
14   width:100px;
15   height:100px;
16   background:pink;
17 }
18 .a1{
19   width:40px;
20   height:40px;
21   background:orange;
22   display:none;
23 }
24   </style>
25 </head>
26
27 <body>
28 <div class="parent">
29   <div class="child"></div>
30    <div class="a1"></div>
31 </div>
32
33  <script>
34 $(‘.parent‘).on(‘mouseenter‘,function(e){
35
36
37     $(‘.a1‘).show(1000);
38
39   });
40
41   $(‘.parent‘).on(‘mouseleave‘,function(e){
42
43
44     $(‘.a1‘).css(‘display‘,‘none‘);
45
46   });
47  </script>
48 </body>
49 </html>

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

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

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <script src="jquery.js"></script>
 5   <meta charset="utf-8">
 6   <title>mouseover mouseout</title>
 7   <style type="text/css" media="screen">
 8       .parent{
 9   width:200px;
10   height:200px;
11   background:black;
12 }
13 .child{
14   width:100px;
15   height:100px;
16   background:pink;
17 }
18 .a1{
19   width:40px;
20   height:40px;
21   background:orange;
22   display:none;
23 }
24
25
26   </style>
27 </head>
28 <body>
29 <div class="parent">
30   <div class="child"></div>
31    <div class="a1"></div>
32 </div>
33
34  <script>
35   $(‘.parent‘).on(‘mouseover‘,function(e){
36      $(‘.a1‘).show(1000);
37
38   });
39
40   $(‘.parent‘).on(‘mouseout‘,function(e){
41      $(‘.a1‘).css(‘display‘,‘none‘);
42
43   });
44
45   $(‘.child‘).on(‘mouseover‘,function(e){
46     e.stopPropagation();
47     $(‘.a1‘).css(‘display‘,‘block‘);
48     //这是保证动画体的末状态不变
49   });
50
51   $(‘.child‘).on(‘mouseout‘,function(e){
52     e.stopPropagation();
53     //防止从粉色框移出到黑色框时再次触发其他事件
54   })
55
56
57
58  </script>
59 </body>
60 </html>

拓展思考:

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

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

 

备注:这篇文章中遇到同样的问题,但我并没怎么看懂,而且觉得有点麻烦,逻辑较繁重。同学们可以作参考。

时间: 2024-10-11 06:27:40

【原创】解决鼠标经过子元素触发mouseout,mouseover事件的问题的相关文章

如何防止鼠标移出移入子元素触发mouseout和mouseover事件

如何防止鼠标移出移入子元素触发mouseout和mouseover事件:关于mouseout和mouseover事件这里就不多介绍了,具体可以参阅javascript的mouseout和mouseover事件详解一章节. 这两个事件有一个共同特点,那就是当鼠标移入或者移出子元素的时候都会触发对应的事件,这个往往在实际应用中是不需要的,或者说能够带来很大的困扰,下面就通过实例代码介绍一下如何避免此影响.代码实例如下: <!DOCTYPE html> <html> <head&g

jquery如何阻止子元素相应mouseout事件

jquery如何阻止子元素相应mouseout事件:mouseout有一个特点,当鼠标移入子元素的时候,也会触发此事件,但是在实际应用中这个特点往往不是我们想要的,下面就通过代码实例介绍一下如何实现此效果,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://ww

mouseover和mouseout事件在鼠标经过子元素时也会触发

JavaScript的mouseover和mouseout事件,在绑定元素内部有子元素的情况下, 经过绑定元素时会多次触发mouseover和mouseout事件. jQuery解决办法: jquery的mouseenter和mouseleave方法已经修复了这个问题,可以直接用来替代mouseover和mouseout 不过有个mouseenter和mouseleave有个小问题是,让鼠标从文档外直接进入绑定事件的元素时,mouseenter不生效 暂时解决办法是,别让绑定事件的元素靠浏览器边

如何阻止div中的子div触发div的事件

<div class="sideFrame" v-on:click="hideside"> <div class="sideFrameDiv" v-on:click.stop="test"> </div> </div> <script> hideside:function(){ hideside要执行的事件 }, test:function(){ 不做任何动作 } &

【转载】设置event.cancelBubble,使触发子元素的onclick不同时触发父元素的onclick

由于HTML中的对象都是层次结构,比如一个Table包含了多个TR,一个TR包含了多个TD Bubble就是一个事件可以从子节点向父节点传递,比如鼠标点击了一个TD,当前的event.srcElement就是这个TD,但是这种冒 泡机制使你可以从TR或者Table处截获这个点击事件,但是如果你event.cancelBubble,则就不能上传事件. 例子: <html> <body> <table border="1" width="26%&qu

mouse事件(mouseleave,mouseenter,mouseout,mouseover)

当指针设备移动到存在监听器的元素或其子元素的时候,事件就会触发区别: mouseover,  mouseout(有冒泡机制) mouseenter,  mouseleave(无冒泡机制) 原文地址:https://www.cnblogs.com/xiaohaodeboke/p/12513266.html

如何解决鼠标移动到子元素 会触发父元素的mouseout事件

方法一. 用mouseleave/mouseenter代替mouseover/mouseout[最佳方法] mouseover与mouseenter mouseover  => 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件.mouseenter => 只有在鼠标指针从元素外穿入被选元素(到元素内)时,才会触发 mouseenter 事件. mouseout与mouseleave mouseout => 不论鼠标指针离开被选元素还是任何子元素,都会触发 mouse

javascript阻止子元素冒泡触发父元素的mouseover、mouseout

本文并没有像标题说的那样,真正阻止事件元素的子元素冒泡... 只是在子元素冒泡到事件元素处时进行了一个判断,判断是否要触发事件,哦...不对 应该是是否要运行事件函数中的相关操作... 首先你可以猛戳这里: 问题的出现 注:jquery中的mouseover/out事件也有此问题 解决方法一: 在ie下有mouseenter 与 mouseleave事件来替代mouseover 和 mouseout. 网上很多说法,这两个事件只有ie支持,其他浏览器不支持. 但是我在最新版本的火狐与谷歌都支持了

JS子元素oumouseover触发父元素onmouseout

JavaScript中,父元素包含子元素: 当父级设置onmouseover及onmouseout时,鼠标从父级移入子级,则触发父级的onmouseout后又触发onmouseover:从子级移入父级后再次触发父级的oumouseout后又触发onmouseover.而如果onmouseover内又应用了计时器便会存在较大的问题.下面针对此问题给出解决方案. 首先,在给出解决方案之前,必须先弄清楚几个对象及方法,分别如下: 1.事件对象 2.事件对象相关属性(只针对onmouseover及onm