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 相关文章推荐
DOM2非标准但却支持很好的几个属性小结
Jan 21 Javascript
Javascript的时间戳和php的时间戳转换注意事项
Apr 12 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
将页面table内容与样式另存成excel文件的方法
Aug 05 Javascript
JavaScript如何获取数组最大值和最小值
Nov 18 Javascript
基于javascript实现窗口抖动效果
Jan 03 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
Jun 13 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
ajax请求data遇到的问题分析
Jan 18 Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 Javascript
VUE : vue-cli中去掉路由中的井号#操作
Sep 04 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 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
PHP开发入门教程之面向对象
2006/12/05 PHP
php上的memcache和memcached两个pecl库
2010/03/29 PHP
smarty简单应用实例
2015/11/03 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
JS跨域总结
2012/08/30 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
python编程实现12306的一个小爬虫实例
2017/12/27 Python
python3.4爬虫demo
2019/01/22 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
团日活动策划书
2014/02/01 职场文书
眼镜促销方案
2014/03/15 职场文书
环保倡议书
2014/04/14 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
爱国影片观后感
2015/06/18 职场文书
2016年端午节寄语
2015/12/04 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python