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 $.each的用法说明
Mar 22 Javascript
script标签的 charset 属性使用说明
Dec 04 Javascript
js中的eventType事件及其浏览器支持性介绍
Nov 29 Javascript
node.js中的fs.lstat方法使用说明
Dec 16 Javascript
Javascript中的对象和原型(二)
Aug 12 Javascript
Javascript动画效果(2)
Oct 11 Javascript
js编写的treeview使用方法
Nov 11 Javascript
vue按需引入element Transfer 穿梭框
Sep 30 Javascript
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 Javascript
js实现整体缩放页面适配移动端
Mar 31 Javascript
js代码实现轮播图
May 04 Javascript
JS中队列和双端队列实现及应用详解
Sep 29 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
Snoopy类使用小例子
2008/04/15 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
详解php中的implements 使用
2017/06/13 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
require.js的用法详解
2015/10/20 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
实例介绍JavaScript中多种组合继承
2019/01/20 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
计算机应用专业推荐信
2013/11/13 职场文书
普师专业个人自荐信范文
2013/11/26 职场文书
医药个人求职信范文
2014/01/29 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
小学作文之描写天气
2019/08/15 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript