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 相关文章推荐
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
原生js实现回复评论功能
Jan 18 Javascript
javascript实现动态显示颜色块的报表效果
Apr 10 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
js实现漂亮的星空背景
Nov 01 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
Nov 15 Javascript
在vue中使用console.log无效的解决
Aug 09 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
通达OA公共代码 php常用检测函数
2011/12/14 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
2014/01/19 PHP
php中stdClass的用法分析
2015/02/27 PHP
php中memcache 基本操作实例
2015/05/17 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
js实现返回顶部效果
2017/03/10 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
Python标准库sched模块使用指南
2017/07/06 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
护理学毕业生自荐信
2013/10/02 职场文书
房产委托公证书
2014/04/08 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
写景作文评语集锦
2014/12/25 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL