首页 > web前端 > js教程 > JavaScript和JQuery的鼠标mouse事件冒泡处理_javascript技巧

JavaScript和JQuery的鼠标mouse事件冒泡处理_javascript技巧

WBOY
发布: 2016-05-16 15:54:06
原创
1482 人浏览过

简单的鼠标移动事件:

进入

复制代码 代码如下:

mouseenter:不冒泡
mouseover: 冒泡

不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件
只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件

移出

复制代码 代码如下:

mouseleave: 不冒泡
mouseout:冒泡

不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件
只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件

我们通过一个案例观察下问题:

给一个嵌套的层级绑定mouseout事件,会发现mouseout事件与想象的不一样

复制代码 代码如下:

外部子元素

内部子元素

0


   

0



我们发现一个问题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: "鼠标悬停",
        mouseleave: "鼠标移开",
        指针输入:“指针”,
        Pointerleave: "指针输出"
    }, 函数(原始, 修复) {
        jQuery.event.special[orig] = {
            delegateType: 修复,
            绑定类型:修复,

            句柄:函数(事件){
                var ret,
                    目标=这个,
                    相关=事件.相关目标,
                    handleObj = event.handleObj;

                // 对于 mouseenter/leave,如果相关内容位于目标之外,则调用处理程序。
                // 注意:如果鼠标离开/进入浏览器窗口,则没有相关目标
                if (!相关 || (相关 !== 目标 && !jQuery.contains(目标, 相关))) {
                    event.type = handleObj.origType;
                    ret = handleObj.handler.apply(this, 参数);
                    event.type = 修复;
                }
                返回 ret;
            }
        };
    });

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板