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

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style type="text/css">
#box{
  width:200px;
  height:200px;
  background-color:red;
  padding:50px;
}
#inner{
  width:50px;
  height:50px;
  background-color:blue;
}
</style>
<script type="text/javascript">
function isMouseLeaveOrEnter(e, handler) {
  var reltg=e.relatedTarget?e.relatedTarget:e.type==‘mouseout‘?e.toElement:e.fromElement;
  while (reltg && reltg != handler){
     reltg = reltg.parentNode;
  }
  return (reltg != handler);
}
window.onload=function(){
  var box=document.getElementById("box");
  var num=document.getElementById("num");
  var count=0;
  box.onmouseout=function(ev){
    var ev=ev||window.event;
    if(!isMouseLeaveOrEnter(ev,box)){
      return false;
    }
    num.innerHTML=count++;
  }
}
</script>
</head>
<body>
<div id="box">
  <div id="inner"></div>
</div>
<div>事件触发了<span id="num"></span>次</div>
</body>
</html>

以上代码实现了我们的要求,可以消除鼠标指针移入或者移出子元素所带来的困扰,虽然例子只是mouseout事件的,对于mouseover事件也是如此,下面就介绍一下此代码的实现过程:
一.实现原理:
当触发这个事件的时候,事件对象都会有一个relatedTarget属性(标准浏览器支持,IE8和IE8以下浏览器需要使用其他属性返回),它能够返回一个与事件目标节点相关的节点,如果返回的节点都是注册事件的对象的子孙元素,说明是我们将要消除的事件触发,所以只要判断如果relatedTarget返回的节点是子孙节点,就进行特殊的处理就可以了,具体可以参阅代码注释。
二.代码注释:
1.function isMouseLeaveOrEnter(e, handler) {},此函数是功能的核心,可以返回一个布尔值用来标识relatedTarget属性返回的是否是子孙节点,如果返回true说明不是子孙节点,如果是false则说明是子孙节点。第一个参数是事件对象,第二个是注册事件处理函数的对象。
2.var reltg = e.relatedTarget ? e.relatedTarget : e.type == ‘mouseout‘ ? e.toElement : e.fromElement,返回事件关联对象,相关属性可以参阅相关阅读。
3.while (reltg && reltg != handler){reltg = reltg.parentNode},一个while循环,条件是:如果reltg存在并且不是当前注册事件的节点,如果条件不被满足,那么将获取reltg的父节点然后再赋值给reltg,如此循环往复。这个语句的作用是判断相关元素是否值子孙元素,如果是的话,总会有一个reltg.parentNode会和handler相同。
4.return (reltg != handler),返回一个布尔值,如果相同就返回false,如果不相同就返回true。
三.相关阅读:
1.relatedTarget属性可以参阅javascript的relatedTarget事件属性一章节。 
2.e.type属性可以参阅javascript的type事件属性一章节。 
3.e.toElement属性可以参阅javascript的toElement事件属性一章节。 
4.e.fromElement属性可以参阅javascript的fromElement事件属性一章节。 
5.parentNode可以参阅js如何元素当前元素所有的父元素一章节。

原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=10649

更多内容可以参阅:http://www.softwhy.com/javascript/

时间: 2024-08-06 02:27:07

如何防止鼠标移出移入子元素触发mouseout和mouseover事件的相关文章

【原创】解决鼠标经过子元素触发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 <

div鼠标悬停,子元素上移,鼠标移出,子元素下移动画。

HTML: <div class="edt_title" > <div id="edt_title"> <p class="edt_title_top">e定投</p> <div class="product_line"></div> <p class="edt_title_c"> 多种期限<br /><b

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

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

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

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

怎么做到点击子元素(子元素自己也绑定了事件)不触发父元素绑定的事件?

给子元素绑定如下事件:$(".elementI").click(function(event){ alert("elementI"); event.stopPropagation() });

从零开始学 Web 之 jQuery(六)为元素绑定多个相同事件,解绑事件

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN:https://blog.csdn.net/lvonve/ 在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目.现在就让我们一起进入 Web 前端学习的冒险之旅吧! 一.为元素绑定多个

JS子元素oumouseover触发父元素onmouseout

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

html事件-子元素事件不触发父元素事件

<div class="list-row" onclick="showChatDialog('dy','100000001',true);"> <img class="icon" src="/icon/default.ico" onclick="personData(event,100000001);"> <a class="nickname">dy&

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

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