一、我们先分析其产生的原因:

1、当鼠标从父级移入子集时触发了父级的两个事件:a、父级的mouseout事件(父级离开到子集);b、由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级);

2、当鼠标从子集移出到父级时又触发了父级的两个事件:a、由于事件冒泡影响,父级触发了mouseout事件(父级移出父级);b、再触发了父级的mouseover事件(子集移入父级)

注:红色字体的解释是事件冒泡的奇妙之处。

二、解决方法:

首先必须先熟悉以下两个方法和一个事件属性:

a,b为节点

1、a.contains(b)

如果a包含b,返回true;否则返回false;a包含a同样返回true(不兼容火狐)

2、 a.compareDocumentPosition(b) 兼容火狐

这玩意就好玩了:

a在b之后返回2;

a在b之前返回4;

a被b包含返回8;

a包含b返回16;

a包含a返回0;

3、ev.relatedTarget

返回事件的目标节点相关的节点;

对于 mouseover 事件来说,该属性是鼠标指针移到目标节点上时所离开的那个节点。

对于 mouseout 事件来说,该属性是离开目标时,鼠标指针进入的节点。(IE9以下不兼容)

但IE7/8下有ev.toElement和ev.fromElement;

mouseover事件对应ev.fromElement

mouseout事件对应ev.toElement

接下来开始解决问题:

假设a是父级;b是与事件关联的节点:

解决原因1:

方法(1)a包含b返回true,a包含a返回true;

方法(2)a移出b(mouseout)返回4+16即返回20;a移入a(mouseover)返回0;

解决原因2:

方法(1)a包含a返回true,a包含b返回true

方法(2)a移出a返回0,b移入a返回4+16即返回20;

要让以上都不执行:

见代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>解决子集影响父级事件</title>
<style type="text/css">
body { width: 100%; height: 100%; padding: 0; margin: 0;}
#div1 { width: 200px; height: 200px; background: red; }
#div2 { width: 100px; height: 100px; background: blue;position: absolute; top: 50px; left: 50px;}
#txt { width: 800px; background: lime; color: red; height: 50px; line-height: 50px; font-size: 30px}
</style>
<script>
window.onload=function(){ var oTxt = document.getElementById('txt');
var a = document.getElementById('div1');
var b = document.getElementById('div2'); alert(b)
a.onmouseover=function(ev){
var oEvent = ev || window.event; if(toAffect(a,oEvent,'mouseover')){
oTxt.value += "移入"+" ";
} }
a.onmouseout=function(ev){
var oEvent = ev || window.event;
if(toAffect(a,oEvent,'mouseout')){
oTxt.value += "移出"+" ";
} }
} function toAffect(obj1,ev,event){
var obj2 = null;
if(ev.relatedTarget){
obj2 = ev.relatedTarget;
}
else{
if(event == 'mouseover'){
obj2 = ev.fromElement;
}
else if(event == 'mouseout'){
obj2 = ev.toElement;
}
}
if(obj1.contains){
return !obj1.contains(obj2);
}
else{
return !!(obj1.compareDocumentPosition(obj2)-20)&&a!=b;
}
}
</script>
</head>
<body>
<div id="div1">
父级
<div id="div2">子集</div>
</div>
<input id="txt" type="text" />
</body>
</html>

代码中的toAffect方法便是解决子集影响父级的方法。

javascript父级鼠标移入移出事件中的子集影响父级的处理方法的更多相关文章

  1. Vue 鼠标移入移出事件

    Vue 中鼠标移入移出事件 @mouseover和@mouseleave 然后绑定style   现在开始代码示例 <template> <div class="pc&qu ...

  2. js鼠标移入移出事件会被子元素触发解决方法

    问题:js写了一个鼠标移入移出事件,但是发现会被内部子元素不断的触发 解决方法:建立一个空的div定位到需要触发的位置,然后设置大小和触发范围一样,最后将事件写在空的div上.

  3. Qt 为QPushButton、QLabel添加鼠标移入移出事件

    QT 为QPushButton.QLabel添加鼠标移入移出事件**要实现的效果:**鼠标移入QPushButton时与移出时按钮变换字体颜色,鼠标移入QLabel时显示上面的文字,移出时不显示.** ...

  4. js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况

    <script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },functio ...

  5. Javascript和jquery事件-鼠标移入移出事件

    javascript使用mouseover和mouseout,只在css中支持hover jquery支持mouseover和mouseout,封装了mouseenter.mouseleave事件函数 ...

  6. JS添加、设置属性以及鼠标移入移出事件

    源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  7. vue 鼠标移入移出事件执行多次(尤其ie)

    来自:https://www.cnblogs.com/myfirstboke/p/9150809.html  侵删 <p @mouseover="over($event)" ...

  8. 为EasyUI的dataGrid单元格增加鼠标移入移出事件

    onLoadSuccess: function (data) { $(".datagrid-row").mouseover(function (e) { var text = $( ...

  9. jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout

    hover:鼠标进入元素的子元素时不会触发‘鼠标移开’的事件: mouseenter.mouseleave:效果与hover相同: mouseover: 鼠标进入元素和进入它的子元素时都会触发‘mou ...

随机推荐

  1. bootstrap style for jQuery UI Dialog

    页面引用: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  2. select 嵌套

    1.查询“001”课程比“002”课程成绩高的所有学生的学号:  select a.S# from (select s#,score from SC where C#=’001′) a,(select ...

  3. 摘录ECMAScript官方文档中重要的两段话

    Every object created by a constructor has an implicit reference (called the object’s prototype) to t ...

  4. Tomcat7开启CGI支持的方法

    tomcat默认没有开启cgi支持,因此有了tomat开启cgi的探索.因为原本对tomcat没多了解,所以中间或多或少走了点弯路.还好最终配置成功了,现在jy也用上这个方法了.    该方法在apa ...

  5. java中的那些坑

    最近准备换工作,为了少让人家鄙视,就要狠狠地藐视这些面试题目.找了本电子书,发了有好多坑,都是特别简单,但是很少有人做对的题目.面对这样的题目,我却有一种兴奋的感觉,也许是因为一直做着重复的工作没有新 ...

  6. JavaScript DOM编程艺术读书笔记(二)

    第五章 最佳实践 平稳退化(graceful degradation):如果正确使用了JavaScript脚本,可以让访问者在他们的浏览器不支持JavaScript的情况下仍能顺利地浏览你网站.虽然某 ...

  7. 大毕设-MATLAB-滤波器的实现

    在工程实际中遇到的信号经常伴有噪声,为了消除或减弱噪声,提取有用信号,必须进行滤波,能实现滤波功能的系统称为滤波器.严格地讲,滤波器可以定义为对已知的激励提供规定响应的系统,响应的要求可以在时域或频域 ...

  8. PHP include 和 require 语句

    在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容. include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码. include 和 requ ...

  9. 误差曲线(Matlab)

    loglog(dof(:),errorestimate(:),:),errorestimate1(:),);hold on; loglog(dof(:),eigvalue(:)-[);%[13.086 ...

  10. hdu5834

    题目让求得是从任意一点出发可以不回来得到的最大的价值 这应该不算特别水的树形dp了,它不止要从上往下dfs,后来海要重新dfs,根据父亲节点更新儿子节点,算是正常的树形dp中比较简单的吧. 思路: 先 ...