zoukankan      html  css  js  c++  java
  • 鼠标移出DIV层时,触发onMouseOut事件,将层隐藏

    话说有一个DIV元素,其内部有一个IMG元素和SPAN元素,不用理会这两个内部元素怎么布局,这不是我要讨论的重点。

    为了实现一些特殊的效果,我需要利用TD的onmouseover和onmouseout事件,测试时就会发现如下的状况:

    当鼠标移入DIV内部时,onmouseover事件被触发;接着再鼠标移动到DIV内部的IMG或者SPAN元素之上,我们肯定不会认为这时鼠标已经移到了DIV的外边,但奇怪的是onmouseout事件触发了,而且紧接着onmouseover事件也马上被触发了。

    这可不是我想要的,那么怎么来“屏蔽”内部元素给外层元素带来的Javascript事件干扰呢?

    这里列举两种方法:

    一. setTimeout

    因为在鼠标移动到内部元素之上而触发了外层元素的onmouseout事件后,外层元素的onmouseover也会马上触发,所以我们只需要把外层元素的onmouseout事件需要执行的动作延迟很短的一段时间来运行,然后在onmouseover事件中再执行clearTimeout方法,这样就可以避免内部元素引起的事件干扰。

    具体的执行过程请看下图(纵向的虚线表示时间):

      这是个很巧妙的的方法,因为当onmouseout触发后,实质性的方法并没有马上执行,而是要等待一小段时间。如果在这段时间里马上又触发了 onmouseover事件,那么基本上就可以肯定onmouseout事件的触发是因为内部元素的干扰了,所以在onmouseover事件中使用 clearTimeout来阻止延时的方法执行。

    二.contains

    在onmouseover时先进行如下判断,结果为true时再执行方法体:

    1         $("#popFormDiv").mouseover(function () {
    2 var s = event.fromElement || event.relatedTarget;
    3 if (!this.contains(s)) { $(this).show("slow"); }
    4 });


    在onmouseout时先进行如下判断,结果为true时再执行方法体:

            $("#popFormDiv").mouseout(function () {
    var s = event.toElement || event.relatedTarget;
    if (!this.contains(s)) { $(this).hide("slow"); }
    });

    下面来解释一下上面两行代码的含义:

    在IE中,所有的HTML元素都有一个contains方法,它的作用是判断当前元素内部是否包含指定的元素。我们利用这个方法来判断外层元素的事件是不是因为内部元素而被触发,如果内部元素导致了不需要的事件被触发,那我们就忽略这个事件。

    event.fromElement指向触发onmouseover和onmouseout事件时鼠标离开的元素;event.toElement指向触发onmouseover和onmouseout事件时鼠标进入的元素。

    那么上面两行代码的含义就分别是:

    ○ 当触发onmouseover事件时,判断鼠标离开的元素是否是当前元素的内部元素,如果是,忽略此事件;

    ○ 当触发onmouseout事件时,判断鼠标进入的元素是否是当前元素的内部元素,如果是,忽略此事件;

    这样,内部元素就不会干扰外层元素的onmouseover和onmouseout事件了。

    但问题又来了,非IE的浏览器并不支持contains函数,不过既然我们已经知道了contains函数的作用,就可以自行添加如下的代码来为非IE浏览器增加contains支持:

     1 if (typeof (HTMLElement) != "undefined") {
    2
    3 HTMLElement.prototype.contains = function (obj) {
    4
    5 while (obj != null && typeof (obj.tagName) != "undefined") {
    6
    7 if (obj == this)
    8
    9 return true;
    10
    11 obj = obj.parentNode;
    12
    13 }
    14
    15 return false;
    16
    17 };
    18
    19 }
  • 相关阅读:
    redis 使用
    VS----id为xxxx的进程当前未运行 问题
    bootstrap--------bootstrap table显示行号
    js--------js获取当前时间,返回日期yyyy-MM-dd
    CLR via C#--------CLR的执行模式
    Python链表成对调换
    Python去除列表中的重复元素
    MySQL索引背后的数据结构及算法原理
    Python 垃圾回收机制
    Python 里的拷贝
  • 原文地址:https://www.cnblogs.com/yujian/p/2286302.html
Copyright © 2011-2022 走看看