首页 > 语言 > JavaScript > 正文

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

2024-05-06 16:23:46
字体:
来源:转载
供稿:网友

这篇文章主要介绍了鼠标经过子元素触发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. .child{ 
  13. width:100px; 
  14. height:100px; 
  15. background:pink; 
  16. .a1{ 
  17. width:40px; 
  18. height:40px; 
  19. background:orange; 
  20. display:none; 
  21. </style> 
  22. </head> 
  23. <body> 
  24. <div class="parent"
  25. <div class="child"></div> 
  26. <div class="a1"></div> 
  27. </div> 
  28. <script> 
  29. $('.parent').on('mouseover',function(e){  
  30. $('.a1').show(1000); 
  31. }); 
  32. $('.parent').on('mouseout',function(e){ 
  33. $('.a1').css('display','none'); 
  34. }); 
  35. </script> 
  36. </body> 
  37. </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. .child{ 
  13. width:100px; 
  14. height:100px; 
  15. background:pink; 
  16. .a1{ 
  17. width:40px; 
  18. height:40px; 
  19. background:orange; 
  20. display:none; 
  21. </style> 
  22. </head> 
  23. <body> 
  24. <div class="parent"
  25. <div class="child"></div> 
  26. <div class="a1"></div> 
  27. </div> 
  28. <script> 
  29. $('.parent').on('mouseenter',function(e){  
  30. $('.a1').show(1000); 
  31. }); 
  32. $('.parent').on('mouseleave',function(e){ 
  33. $('.a1').css('display','none'); 
  34. }); 
  35. </script> 
  36. </body> 
  37. </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. .child{ 
  13. width:100px; 
  14. height:100px; 
  15. background:pink; 
  16. .a1{ 
  17. width:40px; 
  18. height:40px; 
  19. background:orange; 
  20. display:none; 
  21. </style> 
  22. </head> 
  23. <body> 
  24. <div class="parent"
  25. <div class="child"></div> 
  26. <div class="a1"></div> 
  27. </div> 
  28. <script> 
  29. $('.parent').on('mouseover',function(e){ 
  30. $('.a1').show(1000); 
  31. }); 
  32. $('.parent').on('mouseout',function(e){ 
  33. $('.a1').css('display','none'); 
  34. }); 
  35. $('.child').on('mouseover',function(e){ 
  36. e.stopPropagation(); 
  37. $('.a1').css('display','block'); 
  38. //这是保证动画体的末状态不变 
  39. }); 
  40. $('.child').on('mouseout',function(e){ 
  41. e.stopPropagation(); 
  42. //防止从粉色框移出到黑色框时再次触发其他事件 
  43. }) 
  44. </script> 
  45. </body> 
  46. </html> 

拓展思考:

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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选