问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-26 15:15

我来回答

1个回答

热心网友 时间:2022-04-20 01:56

如何防止鼠标移出移入子元素触发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。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... javascript写的mousedown、mousemove、mouseup组合定义的拖动事件在手... 对web前端程序员来说 最重要的是哪个技术 javascript中什么时候用到document.ommousemove js mousemove 时间 ,为什么mousemove不能全部触发,如下面代码,我想通过m... 在js中mousemove后mouseup不执行怎么解决 js mousemove()判断鼠标是否移动,keydown()判断键盘是否被按下,10分钟... js mousemove 的疑问 分离久了想念的句子 深夜思念爱人的句子 思念牵挂一个人的句子说说心情 很思念一个人的说说心情 相思的夜的唯美句子 深夜无法入睡想念爱人的句子有哪些? 深夜想念一个人的暖心说说怎么写? 打印机可以自己修吗? 木瓜酸的做法,木瓜酸怎么做好吃,木瓜酸的家常做法 木瓜酸怎么淹? 美的电热水器f60-15wa1怎么排污 木瓜酸的做法 请专家告诉我美的F50-21B1热水器怎么排污 想学习Web前端开发,这三点你了解吗? javascript如何让表格可以拖动改变列宽度的原理? javascript 怎么鼠标停留在表格的某个单元格上,获得该单元格的值_百度... javascript: window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);啥... Javascript代码中此处return false的作用 JavaScript onmousemove 事件 javascript 使用onMouseDown和onMouseUp来统计我按了多久, 为什么无法达... javascript的关于onmousemove=fun;表示只要鼠标移动一直触发函数,那么... JavaScript的div拖拽,用构造函数,在鼠标移动太快时会使onmousemove失效... 在javascript中如何获得onMouseMove事件停止的状态? canvas 用js怎么做的橡皮檫的效果 如何用JS动态创建层 一般银行审批贷款需要多久?我们的从去年十二月就到银行走程序了,一直到现在也没批下来,该怎么办 闲鱼恶意拍下不付款,我关闭交易,她就一直拍,真烦人 足球简笔画有哪些画法? 足球简笔画怎么画最简单的 求教:我是一个足球守门员(新人),总是不知道怎么做!! 足球守门员接凌空球技巧 业余足球守门员,教你如何开大脚球练习方法 足球守门员应遵守的规则。。