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 web对话框与弹出窗口
Feb 22 Javascript
jquery+json 通用三级联动下拉列表
Apr 19 Javascript
Confirmer JQuery确认对话框组件
Jun 09 Javascript
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 Javascript
web性能优化之javascript性能调优
Dec 28 Javascript
js string 转 int 注意的问题小结
Aug 15 Javascript
jquery组件使用中遇到的问题整理及解决
Feb 21 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
原生js实现ajax方法(超简单)
Sep 20 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
Babel 入门教程学习笔记
Jun 13 Javascript
JavaScript设计模式之单例模式简单实例教程
Jul 02 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
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
yii操作cookie实例简介
2014/07/09 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
Python中的高级函数map/reduce使用实例
2015/04/13 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
python爬取个性签名的方法
2018/06/17 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Python流程控制常用工具详解
2020/02/24 Python
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
J2EE面试题
2016/03/14 面试题
在校生钳工实习自我鉴定
2013/09/19 职场文书
学校欢迎标语
2014/06/18 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
学雷锋倡议书
2015/01/19 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书