解决HTML内部元素的Mouse事件干扰
话说有一个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时再执行方法体:
if(!this.contains(event.fromElement)){MouseOverFunc()}
在onmouseout时先进行如下判断,结果为true时再执行方法体:
if(!this.contains(event.toElement)){MouseOutFunc()}
下面来解释一下上面两行代码的含义:
在IE中,所有的HTML元素都有一个contains方法,它的作用是判断当前元素内部是否包含指定的元素。我们利用这个方法来判断外层元素的事件是不是因为内部元素而被触发,如果内部元素导致了不需要的事件被触发,那我们就忽略这个事件。
event.fromElement指向触发onmouseover和onmouseout事件时鼠标离开的元素;event.toElement指向触发onmouseover和onmouseout事件时鼠标进入的元素。
那么上面两行代码的含义就分别是:
○ 当触发onmouseover事件时,判断鼠标离开的元素是否是当前元素的内部元素,如果是,忽略此事件;
○ 当触发onmouseout事件时,判断鼠标进入的元素是否是当前元素的内部元素,如果是,忽略此事件;
这样,内部元素就不会干扰外层元素的onmouseover和onmouseout事件了。
但问题又来了,非IE的浏览器并不支持contains函数,不过既然我们已经知道了contains函数的作用,就可以自行添加如下的代码来为非IE浏览器增加contains支持:
if(typeof(HTMLElement) != "undefined")
{
HTMLElement.prototype.contains = function(obj)
{
while(obj != null && typeof(obj.tagName) != "undefind")
{
if(obj == this)
Return true;
Obj = obj.parentNode;
}
return false;
};
}
分享到:
相关推荐
例如,在提供的HTML代码中,有两个div元素,分别绑定了`mouseover`和`mouseenter`事件。当鼠标移入`.over`元素或其内部的任何区域时,`mouseover`事件计数器`x`会递增,并更新对应的`<span>`元素的文本和边框样式。...
在这个项目中,我们可能需要用到`mouseenter`和`mouseleave`事件,它们分别在鼠标进入和离开元素时触发。例如,当鼠标进入一个图片或文字元素,我们可以显示工具提示信息;当鼠标离开时,隐藏它。代码可能会像这样:...
例如,`document.getElementById()`用于获取ID为指定值的元素,`element.innerHTML`用来设置或获取元素内部HTML,`element.style.property`可以改变元素样式。 二、事件处理 JavaScript通过事件监听来响应用户的...
通过监听`mouseover`和`mouseout`事件,可以精确控制浮动框的显示和隐藏。 3. **最佳实践**: - **时机**:浮动框应在用户需要帮助或疑惑时出现,而不是在所有地方都显示,以免造成信息过载。 - **位置**:浮动框...
在鼠标移出事件中,需要移除动态创建的工具提示元素,以避免DOM元素的污染。这里使用`.remove()`方法来移除工具提示。 ```javascript $("#tooltip").remove(); ``` #### 8. 实现鼠标移动时的动态响应 为了使工具...
4. **交互逻辑**:需要为表格中的每个单元格绑定鼠标悬停事件(mouseover)和鼠标离开事件(mouseout)。在鼠标悬停事件中调用showBox函数显示完整内容,在鼠标离开事件中隐藏提示容器。 5. **兼容性和优化**:实现...
在ready事件处理函数内部,我们为所有的div元素绑定了一个事件监听器。这个监听器是一个复合事件,它在鼠标悬停(mouseover)时触发一段动画,并在鼠标离开(mouseout)时触发另一段动画。具体来说,当鼠标悬停在一...