javascript父级鼠标移入移出事件中的子集影响父级的处理方法
一、我们先分析其产生的原因:
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父级鼠标移入移出事件中的子集影响父级的处理方法的更多相关文章
- Vue 鼠标移入移出事件
Vue 中鼠标移入移出事件 @mouseover和@mouseleave 然后绑定style 现在开始代码示例 <template> <div class="pc&qu ...
- js鼠标移入移出事件会被子元素触发解决方法
问题:js写了一个鼠标移入移出事件,但是发现会被内部子元素不断的触发 解决方法:建立一个空的div定位到需要触发的位置,然后设置大小和触发范围一样,最后将事件写在空的div上.
- Qt 为QPushButton、QLabel添加鼠标移入移出事件
QT 为QPushButton.QLabel添加鼠标移入移出事件**要实现的效果:**鼠标移入QPushButton时与移出时按钮变换字体颜色,鼠标移入QLabel时显示上面的文字,移出时不显示.** ...
- js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况
<script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },functio ...
- Javascript和jquery事件-鼠标移入移出事件
javascript使用mouseover和mouseout,只在css中支持hover jquery支持mouseover和mouseout,封装了mouseenter.mouseleave事件函数 ...
- JS添加、设置属性以及鼠标移入移出事件
源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- vue 鼠标移入移出事件执行多次(尤其ie)
来自:https://www.cnblogs.com/myfirstboke/p/9150809.html 侵删 <p @mouseover="over($event)" ...
- 为EasyUI的dataGrid单元格增加鼠标移入移出事件
onLoadSuccess: function (data) { $(".datagrid-row").mouseover(function (e) { var text = $( ...
- jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout
hover:鼠标进入元素的子元素时不会触发‘鼠标移开’的事件: mouseenter.mouseleave:效果与hover相同: mouseover: 鼠标进入元素和进入它的子元素时都会触发‘mou ...
随机推荐
- openssl大纲
1.加密和SSL机制:http://www.cnblogs.com/f-ck-need-u/p/6089523.html 2.openssl命令总指挥:http://www.cnblogs.com/f ...
- elasticsearch同义词及动态更新
第一种:参考地址:http://dev.paperlesspost.com/setting-up-elasticsearch-synonyms/271.Add a synonyms file.2.Cr ...
- BeanUtils.populate的作用
它是在org.apache.commons.beanutils.BeanUtils包中的一个方法. 方法的作用:将一些 key-value 的值(例如 hashmap)映射到 bean 中的属性. ...
- UVa 694 - The Collatz Sequence
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94&page=s ...
- Sql Server中不常用的表运算符之PIVOT
PIVOT是SQL Server2005新添加的一个表运算符,作用在于将行转为列. 先来看看他的基本语法: 来自http://technet.microsoft.com/zh-cn/library/m ...
- Sql Server隔离级别(2)
Sql Server2005之后,引入了一个新的隔离级别Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation ( ...
- springmvc spring mybatis插入mysql中文乱码
springmvc 插入mysql数据库中文乱码问题: 1.将页面中的编码改成utf-8 2.用SQLyog右击->改变数据库 以上两步可以保证页面数据编码一致 3.在mybatis连接的地方加 ...
- RapidXML 试用
近半年来断断续续的封装一些SDK,在兼顾跨平台.易用性和高效率上还要顾及到对外dll的大小问题.由于之前解析SVG文件的用到了一个XML解析库xercesc,这个DLL实在巨大近4M,于是尝试用新的X ...
- Linux下如何查看系统启动时间和运行时间
1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.002.查看/proc/uptime文件计算系 ...
- 谈谈Activiti中流程对象之间的关系
详细见:http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html (咖啡兔好牛!) 详细见: http://blo ...