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 相关文章推荐
JavaScript this 深入理解
Jul 30 Javascript
javascript实现控制浏览器全屏
Mar 30 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
vue2项目使用sass的示例代码
Jun 28 Javascript
vue编译打包本地查看index文件的方法
Feb 23 Javascript
深入理解Vue nextTick 机制
Apr 28 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
一文读懂vue动态属性数据绑定(v-bind指令)
Jul 20 Javascript
vue脚手架项目创建步骤详解
Mar 02 Vue.js
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文件上传实例详解!!!
2007/01/02 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
JavaScript中条件语句的优化技巧总结
2020/12/04 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python写的英文字符大小写转换代码示例
2015/03/06 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
基于python实现聊天室程序
2018/07/27 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
python 发送json数据操作实例分析
2019/10/15 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
普通PHP程序员笔试题
2016/01/01 面试题
大二法学专业职业生涯规划范文
2014/02/12 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
批评与自我批评范文
2014/10/15 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
Python时间操作之pytz模块使用详解
2022/06/14 Python