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 不只是脚本
May 30 Javascript
JavaScript中的16进制字符(改进)
Nov 21 Javascript
jquery 插件学习(四)
Aug 06 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
Jul 14 Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 Javascript
jquery实现自定义图片裁剪功能【推荐】
Mar 08 Javascript
js实现带进度条提示的多视频上传功能
Dec 13 Javascript
JS匿名函数内部this指向问题详析
May 10 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
Sep 04 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
关于JS中的作用域中的问题思考分享
Apr 06 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 __autoload()方法真的影响性能吗?
2012/03/30 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
React中的refs的使用教程
2018/02/13 Javascript
javascript使用substring实现的展开与收缩文字功能示例
2019/06/17 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
pymongo为mongodb数据库添加索引的方法
2015/05/11 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
python基于ID3思想的决策树
2018/01/03 Python
浅析python协程相关概念
2018/01/20 Python
python实现俄罗斯方块游戏
2020/03/25 Python
详解Python中的正则表达式
2018/07/08 Python
python3.6的venv模块使用详解
2018/08/01 Python
Python多图片合并PDF的方法
2019/01/03 Python
python实现桌面壁纸切换功能
2019/01/21 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
优秀少先队员主要事迹材料
2014/05/28 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
2014年卫生院工作总结
2014/12/03 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis