JavaScript和JQuery的鼠标mouse事件冒泡处理


Posted in Javascript onJune 19, 2015

简单的鼠标移动事件:

进入

mouseenter:不冒泡

mouseover: 冒泡

不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件
只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件

移出

mouseleave: 不冒泡

mouseout:冒泡

不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件
只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件

我们通过一个案例观察下问题:

给一个嵌套的层级绑定mouseout事件,会发现mouseout事件与想象的不一样

<!DOCTYPE html><div class="out overout" style="width:40%;height:120px; margin:0 15px;background-color:#D6EDFC;float:left;" data-mce-style="width: 40%; height: 120px; margin: 0 15px; background-color: #d6edfc; float: left;"><p style="border:1px solid red" data-mce-style="border: 1px solid red;">外部子元素</p><div class="in overout" style="width:60%;background-color:#FFCC00;margin:10px auto;" data-mce-style="width: 60%; background-color: #ffcc00; margin: 10px auto;"><p style="border:1px solid red" data-mce-style="border: 1px solid red;">内部子元素</p><p id="inshow">0</p>

    </div><p id="outshow">0</p>

</div><script type="text/javascript">
    var i = 0;

    var k = 0;
    document.querySelectorAll('.out')[0].addEventListener('mouseout',function(e){

        document.querySelectorAll("#inshow")[0].textContent = (++i)

       e.stopPropagation();

    },false)
   document.querySelectorAll('.in')[0].addEventListener('mouseout',function(){

       document.querySelectorAll("#outshow")[0].textContent = (++k)

    },false)
</script>

我们发现一个问题mouseout事件:

1.无法阻止冒泡
2.在内部的子元素上也会触发

同样的问题还有mouseover事件,那么在stopPropagation方法失效的情况下我们要如何停止冒泡呢?

1.为了阻止mouseover和mouseout的反复触发,这里要用到event对象的一个属性relatedTarget,这个属性就是用来判断 mouseover和mouseout事件目标节点的相关节点的属性。简单的来说就是当触发mouseover事件时,relatedTarget属性代表的就是鼠标刚刚离开的那个节点,当触发mouseout事件时它代表的是鼠标移向的那个对象。由于MSIE不支持这个属性,不过它有代替的属性,分别是 fromElement和toElement。
2.有了这个属性,我们就能够清楚的知道我们的鼠标是从哪个对象移过来,又是要移动到哪里去了。这样我们就能够通过判断这个相关联的对象是否在我们要触发事件的对象的内部,或者是不是就是这个对象本身。通过这个判断我们就能够合理的选择是否真的要触发事件。
3.这里我们还用到了一个用于检查一个对象是否包含在另外一个对象中的方法,contains方法。MSIE和FireFox分别提供了检查的方法,这里封装了一个函数。

jQuery的处理也是如出一辙

jQuery.each({

        mouseenter: "mouseover",

        mouseleave: "mouseout",

        pointerenter: "pointerover",

        pointerleave: "pointerout"

    }, function(orig, fix) {

        jQuery.event.special[orig] = {

            delegateType: fix,

            bindType: fix,
            handle: function(event) {

                var ret,

                    target = this,

                    related = event.relatedTarget,

                    handleObj = event.handleObj;
                // For mousenter/leave call the handler if related is outside the target.

                // NB: No relatedTarget if the mouse left/entered the browser window

                if (!related || (related !== target && !jQuery.contains(target, related))) {

                    event.type = handleObj.origType;

                    ret = handleObj.handler.apply(this, arguments);

                    event.type = fix;

                }

                return ret;

            }

        };

    });
Javascript 相关文章推荐
经典的解除许多网站无法复制文字的绝招
Dec 31 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
Jan 17 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
Sep 19 Javascript
jquery prop的使用介绍及与attr的区别
Dec 19 Javascript
使用AJAX实现Web页面进度条的实例分享
May 06 Javascript
JavaScript数据类型转换的注意事项
Jul 31 Javascript
微信小程序 wxapp内容组件 progress详细介绍
Oct 31 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
angularjs结合html5实现拖拽功能
Jun 25 Javascript
如何通过setTimeout理解JS运行机制详解
Mar 23 Javascript
微信小程序登录态和检验注册过没的app.js写法
May 22 Javascript
Javascript前端下载后台传来的文件流代码实例
Aug 18 Javascript
TypeScript 中接口详解
Jun 19 #Javascript
TypeScript 学习笔记之基本类型
Jun 19 #Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 #Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 #Javascript
深入讲解AngularJS中的自定义指令的使用
Jun 18 #Javascript
3个可以改善用户体验的AngularJS指令介绍
Jun 18 #Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 #Javascript
You might like
php,不用COM,生成excel文件
2006/10/09 PHP
探讨如何在php168_cms中提取验证码
2013/06/08 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
php实现websocket实时消息推送
2018/03/30 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
python 使用shutil复制图片的例子
2019/12/13 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
小学生开学感言
2014/02/28 职场文书
讲座主持词
2014/03/20 职场文书
病危通知单
2015/04/17 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL