鼠标mouse事件冒泡处理

简介:

简单的鼠标移动事件:

进入

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

移出

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

 

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

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


我们发现一个问题mouseout事件:

  1. 无法阻止冒泡
  2. 在内部的子元素上也会触发

 


 同样的问题还有mouseover事件,那么在stopPropagation方法失效的情况下我们要如何停止冒泡呢?

  • 为了阻止mouseover和mouseout的反复触发,这里要用到event对象的一个属性relatedTarget,这个属性就是用来判断 mouseover和mouseout事件目标节点的相关节点的属性。简单的来说就是当触发mouseover事件时,relatedTarget属性代表的就是鼠标刚刚离开的那个节点,当触发mouseout事件时它代表的是鼠标移向的那个对象。由于MSIE不支持这个属性,不过它有代替的属性,分别是 fromElement和toElement。
  •     有了这个属性,我们就能够清楚的知道我们的鼠标是从哪个对象移过来,又是要移动到哪里去了。这样我们就能够通过判断这个相关联的对象是否在我们要触发事件的对象的内部,或者是不是就是这个对象本身。通过这个判断我们就能够合理的选择是否真的要触发事件。
  •     这里我们还用到了一个用于检查一个对象是否包含在另外一个对象中的方法,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;
            }
        };
    });
复制代码

 本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/p/4241531.html,如需转载请自行联系原作者


相关文章
|
6月前
15zTree - 其他鼠标事件监听
15zTree - 其他鼠标事件监听
18 0
|
8月前
|
JavaScript
原生js实现鼠标长按事件
原生js实现鼠标长按事件
83 0
|
9月前
用 mouse 事件写一个可拖拽的 div
用 mouse 事件写一个可拖拽的 div
49 0
Qt | 鼠标事件和滚轮事件 QMouseEvent、QWheelEvent
学习使用Qt的鼠标事件和滚轮事件。
683 0
双击事件与单击事件的那些事
双击事件与单击事件的那些事
466 0
|
JavaScript 前端开发 数据安全/隐私保护
鼠标事件、键盘事件,你听过嘛?
鼠标事件、键盘事件,你听过嘛?
141 0
鼠标事件、键盘事件,你听过嘛?
重新认识键盘与鼠标——键盘事件与鼠标事件
重新认识键盘与鼠标——键盘事件与鼠标事件
250 0
重新认识键盘与鼠标——键盘事件与鼠标事件
|
Windows
49、鼠标事件
鼠标事件主要有下面这些,所有事件都继承了MouseEvent接口。
238 0
|
Windows
50、键盘事件
键盘事件由用户击打键盘触发,主要有keydown、keypress、keyup三个事件,它们都继承了KeyboardEvent接口。
203 0

热门文章

最新文章