如何避免鼠标移入子级触发父级的移出事件(两种方法)

news/2024/7/19 16:31:33 标签: js

我们经常会遇到一个问题,我们使用onmouseover和onmouseout控制鼠标的的移入移出时,如果是将鼠标从父级移动到子级的时候,会触发子级的冒泡事件,导致父级先触发移出事件后立即触发移入事件,在IE下效果不是特别好,那我这里有两种解决办法

1、利用js解决:其实就是将onmouseover和onmouseout用onmouseenter和onmouseleave来替代,我们知道与over和呕吐不同的是enter和leave,子级不会影响父级,所以自然也就解决了上面的问题

但这两个方法有兼容性问题:在IE下基本都支持,但在老版本的Chrome和Opera下不支持,而且处理兼容性也比较麻烦,所以,在使用的时候,要根据情况而定

2、利用css处理,其实很简单,就是加一个层(透明层,和父级大小一样),这个没有兼容性问题,只是可能会多一些闲置的代码,不过这种方法还是比较简单的

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<style>
#div1{ width:200px; height:200px; background:red;}
#div2{ width:100px; height:100px; background:yellow;}
</style>
<script>
window.onload = function(){
	var oDiv1 = document.getElementById('div1');
	var oDiv2 = document.getElementById('div2');
	
	oDiv1.onmouseover = function(ev){
		var ev = ev || window.event;
		var a = this, b = ev.relatedTarget;
		
		//console.log(a.innerHTML);
		//console.log(b.innerHTML);
		
		if( !elContains(a,b) && a!=b ){
			
			document.title += '1';
			
		}
	};
	
	oDiv1.onmouseout = function(ev){
		
		var ev = ev || window.event;
		var a = this, b = ev.relatedTarget;
		
		if(!elContains(a,b) && a!=b){
			document.title += '2';
			
		}
	};
};

function elContains(a, b){  //判断两个元素是否是嵌套关系
	
	return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(b) & 16);
	
}

</script>
</head>

<body>
<div id="div1">
	<div id="div2"></div>
</div>
</body>
</html>

补充知识:

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;



http://www.niftyadmin.cn/n/952172.html

相关文章

游标中LOCAL的意思

SQL SERVER 2000 中使用游标 在开发的过程中我们通常都会使用游标来处理数据库中的信息&#xff0c;但是我们所写的代码往往就下面的例子一样&#xff1a;DECLAREmyCursor CURSORFORSELECT… FROMTABLEOPENmyCursor--do somethingCLOSEmyCursorDEALLOCATEmyCursor这段代码存在着…

python r语言 三种_r语言中有哪些取整运算_python和r语言的区别对比_python与r语言哪 - 编程语言及工具 - 电子发烧友网...

r语言中有的一些取整运算在编程实现的时候有时会碰到对数值取整的需求&#xff0c;而取整的方式却多种多样&#xff0c;依赖于具体问题&#xff0c;不过在R中已经配备了种类齐全的相关函数。主要包括以下五种&#xff1a;floor()&#xff1a;向下取整&#xff1b;ceiling()&…

js中的历史状态管理方法总结

通过观看妙味视频以及看js高级程序设计对历史状态管理做一个小小的总结&#xff0c;方便以后查阅 我们知道浏览器上面有个“前进”和“后退”按钮&#xff0c;如果我们不做过多的设置&#xff0c;它们只有当我们打开了一个新页面的时候才会起作用&#xff0c;而在现代web应用中…

python拷贝dbf文件_python读写dbf文件

最近要完成数据导出dbf格式的文件的功能&#xff0c;在网上找了一个pydbf这个库&#xff0c;折腾了半天又是字符编码问题&#xff0c;后来才搜到了这段代码&#xff0c;比较轻量级的&#xff0c;虽然已是十年前的代码&#xff0c;暂时没有发现什么大的问题&#xff0c;调试起来…

转:验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合] C#

网上有很多关于验证码做法的资料,但是真正做得完整的却非常少,所以昨天晚上参考了作者&#xff1a;CSDN 上kwklover 的在ASP.NET下实现数字和字符相混合的验证码 (混合,完整,遗憾的是vb.net,说到这里我想我得感谢stone(QQ9337874),因为我在把VB译成C#的过程中几番出错,最终这段…

深入理解原生js拖放(draggable)

本来是打算要自己总结的&#xff0c;但发现了一篇比较好的博客&#xff0c;把我想写的都写了&#xff0c;甚至更加全面&#xff0c;所以&#xff0c;我只把我认为比较重要的知识点提炼一下&#xff0c;其他的都是转载的&#xff0c;想看原博主的请点击原生js拖放 提炼知识点&am…

qt中如何使widget与mainwindows宽度保持一致_【PTV Visum】VISUM导入VISSIM中交叉口处理的小常识(二)...

1 前言在第一篇中&#xff0c;我们对交叉口构成的基本要素进行了详细解释&#xff0c;在这里我们将介绍信号控制机、交叉口要素先后编辑顺序、VISSIM导入、模板应用几部分内容&#xff0c;最后解答在第一篇中提出的问题。2 信号控制机的创建2.1信号控制机类型在点击创建信号控制…

深入理解JSON对象

看了js高级程序设计这本书关于json的讲解&#xff0c;下面我把里面我认为比较重要的知识提炼出来&#xff0c;一方面给帮助自己理解&#xff0c;同时也分享给有需要的朋友 json:是一种数据格式&#xff0c;不是一种编程语言 json的语法可以表示简单值&#xff08;字符串、数值、…