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 相关文章推荐
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
javascript 数组排序函数
Aug 20 Javascript
js猜数字小游戏的简单实现代码
Jul 02 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
Nov 05 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
Feb 21 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
jQuery制作图片旋转效果
Feb 02 Javascript
基于JavaScript canvas绘制贝塞尔曲线
Dec 25 Javascript
elementUI select组件默认选中效果实现的方法
Mar 25 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
Sep 11 Javascript
如何使JavaScript休眠或等待
Apr 27 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语法(4)
2006/10/09 PHP
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
Yii全局函数用法示例
2017/01/22 PHP
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
python的keyword模块用法实例分析
2015/06/30 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python requests库用法实例详解
2018/08/14 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
Python中的枚举类型示例介绍
2019/01/09 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
Python截图并保存的具体实例
2021/01/14 Python
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
大学毕业寄语大全
2014/04/10 职场文书
实习报告评语
2014/04/26 职场文书
遗愿清单观后感
2015/06/09 职场文书
护理培训心得体会
2016/01/22 职场文书
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
MySQL查询日期时间
2022/05/15 MySQL