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 解析url的search方法
Feb 09 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
jQuery简单实现两级下拉菜单效果代码
Sep 15 Javascript
jQuery AJAX timeout 超时问题详解
Jun 21 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
three.js中文文档学习之创建场景
Nov 20 Javascript
vue.js系列中的vue-fontawesome使用
Feb 10 Javascript
vue 组件中slot插口的具体用法
Apr 03 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
JS复杂判断的更优雅写法代码详解
Nov 07 Javascript
原生JS实现音乐播放器的示例代码
Feb 25 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
JavaScript 中的事件教程
2007/04/05 Javascript
js计算页面刷新的次数
2009/07/20 Javascript
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python 自定义装饰器实例详解
2019/07/20 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
文秘自荐信
2013/10/20 职场文书
二年级体育教学反思
2014/01/15 职场文书
高中军训感言1000字
2014/03/01 职场文书
工作岗位说明书模板
2014/05/09 职场文书
物资采购方案
2014/06/12 职场文书
授权委托书格式
2014/07/31 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
汽车销售员岗位职责
2015/04/11 职场文书