onmouseover事件和onmouseout事件全面理解


Posted in Javascript onAugust 15, 2016

这两天接触了onmouseover事件和onmouseout事件,一直以为它们只是简单的分别实现鼠标指针移动到元素上时触发事件和在鼠标指针移出指定的对象时触发事件,但是突然发现这些只是对它们简单的描述,下面让我们一起看看它们终究还有神马奇怪的特性,是好还是坏呢?

首先实现一个盒子:

onmouseover事件和onmouseout事件全面理解

给这个盒子上绑定上onmouseover事件和onmouseout事件

onmouseover事件和onmouseout事件全面理解

发现它们不会发生什么问题,然后(嘿嘿,你懂得!)

onmouseover事件和onmouseout事件全面理解

让我们创建一个B元素,让它被嵌套在A元素中,作为A的子元素

onmouseover事件和onmouseout事件全面理解

我们依旧只给外层父元素A绑定onmouseover事件和onmouseout事件,你会发现发生什么了呢?对,没错!当鼠标移入移除A的子元素B的时候居然也发生了onmouseover事件和onmouseout事件!!Why?这不是我想要的!难道这时候B就不在是A的一部分了吗?当然不是,要不也不会在移入B元素时发生onmouseover事件。这样证明,B元素还是A不可分割的一部分啊。

那到底是怎么回事呢?终究还是事件冒泡搞得鬼?大家都知道常用的浏览器中有两种事件流:事件冒泡和事件捕获。让我们看一下事件冒泡的定义:事件按照从最特定的事件目标逐级向上传播到最不特定的事件目标(document对象)的顺序。所以说当鼠标移入移除A的子元素B的时候,B的onmouseover事件和onmouseout事件会触发,但是它自己没有这两个事件啊,就把这两个事件传递给了它的父元素A,A有这两个事件所以就发生了我们看到的情况。

有人会说那怎么避免呢,毕竟不是所有人都会是这种需求嘛,我们只要父级元素的事件触发就好,子级元素就让它静静的当个美男子就好了。

所以W3C在mouseover和mouseout事件中添加了relatedTarget属性 :

•在mouseover事件中,它表示鼠标来自哪个元素

•在mouseout事件中,它指向鼠标去往的那个元素

而而Microsoft在mouseover和mouseout事件中添加了两个属性

•fromElement,在mouseover事件中表示鼠标来自哪个元素

•toElement,在mouseout事件中指向鼠标去往的那个元素

所以我们就有了如下代码的实现

document.getElementById('box1').onmouseover = function (e) {
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.fromElement;
while (reltg && reltg != this) reltg = reltg.parentNode;
if (reltg != this) {
// 这里可以编写 onmouseenter 事件的处理代码
alert('111');
}
}
document.getElementById('box1').onmouseout = function (e) {
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.toElement;
while (reltg && reltg != this) reltg = reltg.parentNode;
if (reltg != this) {
// 这里可以编写 onmouseleave 事件的处理代码
alert('2222');
}
}

以上所述是小编给大家介绍的onmouseover事件和onmouseout事件的全面了解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript+mapbar实现地图定位
Apr 09 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
js中replace的用法总结
Dec 27 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 Javascript
JS判断form内所有表单是否为空的简单实例
Sep 09 Javascript
深入理解Javascript中的作用域链和闭包
Apr 25 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
详解tween.js的使用教程
Sep 14 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
js实现input密码框显示/隐藏功能
Sep 10 Javascript
浅谈javascript事件环微任务和宏任务队列原理
Sep 12 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
Aug 15 #Javascript
又一款js时钟!transform实现时钟效果
Aug 15 #Javascript
最丑的时钟效果!js canvas时钟制作方法
Aug 15 #Javascript
深入分析javascript中console命令
Aug 14 #Javascript
Vue.js 表单校验插件
Aug 14 #Javascript
Vue.js学习笔记之 helloworld
Aug 14 #Javascript
详解Node.js如何开发命令行工具
Aug 14 #Javascript
You might like
dedecms模版制作使用方法
2007/04/03 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
php创建类并调用的实例方法
2019/09/25 PHP
js同时按下两个方向键
2007/12/01 Javascript
jQuery的学习步骤
2011/02/23 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python实现简易Web爬虫详解
2018/01/03 Python
python操作mysql代码总结
2018/06/01 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
个人评价范文分享
2014/01/11 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
教师个人工作总结范文2014
2014/11/10 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
Python 全局空间和局部空间
2022/04/06 Python
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server