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 相关文章推荐
js parentElement和offsetParent之间的区别
Mar 23 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
Apr 25 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
删除javascript所创建子节点的方法
May 21 Javascript
jQuery实现简单的图片查看器
Sep 11 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
React-Native使用Mobx实现购物车功能
Sep 14 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
vue实现图片懒加载的方法分析
Feb 05 Javascript
vue 实现超长文本截取,悬浮框提示
Jul 29 Javascript
jQuery实现简单评论区功能
Oct 26 jQuery
浅谈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
利用PHP创建动态图像
2006/10/09 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
javascript的函数
2007/01/31 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
vue如何判断dom的class
2018/04/26 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
对python 调用类属性的方法详解
2019/07/02 Python
python:动态路由的Flask程序代码
2019/11/22 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
工程业务员工作职责
2013/12/07 职场文书
继电保护工岗位职责
2014/01/05 职场文书
校庆标语集锦
2014/06/25 职场文书
房屋转让协议书
2014/10/18 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript