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 ...
随机推荐
- Bash脚本15分钟进阶指导
首先声明这是网上摘来的.这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT).这里是一个修订和扩增版本. 脚本安全 我的所有bash脚本都以下面几句为开场白: # ...
- java工程或web工程项目上出现红色感叹号
最近在新公司重新搭建mybatis3+spring4框架的时候出现的问题.确定这个问题是出现在项目的build path里面,但是如果jar包上没出现红X就不知道哪个jar包有问题了,最笨的办法是删除 ...
- Memcached安装配置及访问
1.Memcached键值对访问,对于网页来说,key需要使用uri. 2.Memcached的相关配置 memcached:缓存服务器,但本身无法决定缓存任何数据 一半依赖于客户端,一半依赖于服务端 ...
- sys模块和os模块,利用sys模块生成进度条
sys模块import sysprint(sys.argv)#sys.exit(0) #退出程序,正常退出exit(0)print(sys.version) #获取 ...
- 微信支付-“申请退款”接口遇到curl出错,错误码:58
该错误是没有 使用证书 导致的. 解决办法: 1. 下载证书. 2. 拷贝到 WxPayPubHelper/cacert/目录下 重试退款,OK
- 通过profiler对unity进行针对性优化
转 : http://user.qzone.qq.com/289422269/blog/1453815629?ptlang=2052 通过profiler对unity进行针对性优化 1. CPU U ...
- c++多态
#include <cstdio> using namespace std; class Base { public: virtual void A() { puts("Base ...
- javascript DOM 操作
在javascript中,经常会需要操作DOM操作,在此记录一下学习到DOM操作的知识. 一.JavaScript DOM 操作 1.1.DOM概念 DOM :Document Object Mode ...
- spring+junit单元测试
<1>读取文件: 配置文件在classes下:locations = {"classpath*:/spring/applicationContext.xml"} 配置文 ...
- 使用Linux碎解一
一.安装VMwarestation. 二.安装Linux系统(这里是CentOS7) 步骤: #==========================part1===================== ...