`
shuai1234
  • 浏览: 971910 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

JS中onmouseover与onmouseout的bug/js避免onmouseover onmouseout多次触发

 
阅读更多

在Javascript中,父元素包含子元素,当给父元素设置onmouseover或onmouseout事件时,鼠标从父级移入子级的时候会多次触发onmouseover事件;鼠标从子级移入父级后再次移出的时候也会多次触发onmouseout事件。所以这个问题要解决,不然在以后的事例中出现很大的问题。

下面我们首先要熟悉几个对象与方法:

1)事件对象:

2)事件对象相关属性(只针对onmouseover与onmouseout):

  标签源:oEvent.fromElement(从哪里来的元素):兼容IE,Chrome

      oEvent.toElement(去哪里的元素):兼容IE,Chrome

      oEvent.relateTarget(相关元素):兼容FF 

3)判断一个元素是不是包含在另一个元素中的方法:元素.contains(Node)   

了解了上面的方法后,开始解决上面的问题:当onmouseover时,鼠标移过父级元素的时候,不会有任何的问题,当从父级移入子级的时候就会出现问题;同样当onmouseout时,鼠标从父级移出的时候也没有问题,但从子级往父级移动的时候就会多次触发onmouseout事件,我们解决的方法就是设置当从父级移入子级的时候或是从子级往父级移动的时候这个事件无效。

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>onmouseover的bug</title>
<style>
div{ width:200px; height:200px; background:#ccc; margin:40px auto; }
h3{ height:30px; background:yellow; }
</style>
<script>
    window.onload=function(){
        var oDiv=document.getElementsByTagName('div')[0];
            oDiv.onmouseover=function(ev){
                var oEvent=ev||event;
                var oFrom=oEvent.fromElement||oEvent.relatedTarget;
                //其中oEvent.fromElement兼容IE,chrome
                //oEvent.relatedTarget;兼容FF。
                if(this.contains(oFrom)) return; //判断div是不是包含oFrom,如果包含就返回
                alert('移入了');
            };
    };
</script>
</head>

<body>
    <div>
        <h3></h3>
    </div>
</body>

 

同样的鼠标移出事件onmouseout时,可以写成下面这种:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>onmouseout的bug</title>
<style>
div{ width:200px; height:200px; background:#ccc; margin:40px auto; }
h3{ height:30px; background:yellow; }
</style>
<script>
    window.onload=function(){
        var oDiv=document.getElementsByTagName('div')[0];
            oDiv.onmouseout=function(ev){
                var oEvent=ev||event;
                var oTo=oEvent.toElement||oEvent.relatedTarget;
                //其中oEvent.toElement兼容IE,chrome
                //oEvent.relatedTarget;兼容FF。
                if(this.contains(oTo)) return; //判断div是不是包含oTo,如果包含就返回
                alert('移出了');
            };
    };
</script>
</head>

<body>
    <div>
        <h3></h3>
    </div>
</body>

其实我们还可以使用onmouseenter与onmouseleave事件来代替onmouseover与onmouseout事件,网上查了一下说onmouseenter与onmouseleave事件不稳定,而且有的时候只兼容IE内核的浏览器,我现在试了一个兼容性很是很好的,可以尝试使用噢!

 

 

 js避免onmouseover onmouseout多次触发


 //------------------------------------------------------------
function contains(parentNode, childNode) 
{
    if (parentNode.contains) {
        return parentNode != childNode && parentNode.contains(childNode);
    } else {
        return !!(parentNode.compareDocumentPosition(childNode) & 16);
    }
}
function checkHover(e,target)
{
    if (getEvent(e).type=="mouseover")  {
        return !contains(target,getEvent(e).relatedTarget||getEvent(e).fromElement) && !((getEvent(e).relatedTarget||getEvent(e).fromElement)===target);
    } else {
        return !contains(target,getEvent(e).relatedTarget||getEvent(e).toElement) && !((getEvent(e).relatedTarget||getEvent(e).toElement)===target);
    }
}
function getEvent(e){
    return e||window.event;

}

//把以上代码copy,然后在onmouseover="abc(event,this)"

function abc(e, obj)

{

  if(checkHover(e,obj)){

//..这里写你要做的事情即可。
        }

}

 
 
分享到:
评论

相关推荐

    onmouseover事件和onmouseout事件全面理解

    在JavaScript中,`onmouseover`和`onmouseout`事件是两个非常常见的用于处理用户交互的事件。它们主要用于响应用户将鼠标指针移到元素上方或移出元素时的行为。这两个事件在网页动态效果和用户界面交互设计中扮演着...

    兼容ie和firefox的鼠标经过(onmouseover和onmouseout)实现--简短版

    在本篇文章中,我们将探讨如何使用CSS和JavaScript来实现兼容IE和Firefox的鼠标经过效果(onmouseover和onmouseout)。在前端开发中,鼠标经过效果是一个非常常用的交互效果,然而不同的浏览器对其支持的方式不同,...

    图片onmouseover 和onmouseout 事件,根据图片不同大小显示不同大小的div,鼠标移上去显示该图片详细信息

    在网页设计中,`onmouseover` 和 `onmouseout` 是两个非常重要的JavaScript事件,它们用于实现用户交互功能,特别是创建动态效果和提供额外信息。在这个特定的案例中,这两个事件被用来控制一个div元素,使其根据...

    onmouseover和onmouseout的一些问题思考

    本文将深入探讨两个常见的鼠标事件:`onmouseover`和`onmouseout`,以及它们在不同浏览器中的行为差异,以及如何解决由此引发的问题。 `onmouseover`事件会在鼠标指针进入一个元素时触发,包括进入该元素的任何子...

    js ondocumentready onmouseover onclick onmouseout 样式

    `onmouseout` 事件与 `onmouseover` 类似,但在鼠标离开元素时触发。这同样可用于动态调整元素的样式或执行其他操作。 #### 示例代码解析: 虽然提供的代码片段不完整,但基于常见的实现,我们可以推测 `doMouseout...

    js触发事件大全

    JavaScript触发事件是网页交互设计的核心组成部分,它们允许开发者在用户与网页进行互动时执行特定的代码块。以下是对“js触发事件大全”中所提及的关键事件的深入解析,旨在为前端开发者提供全面的理解。 ### 一、...

    js事件触发大全

    JS事件触发大全是指在 JavaScript 中各种事件的触发机制,这些事件可以在不同的元素上触发,例如按钮、链接、文本框、图片等。这些事件可以被 JavaScript 代码捕捉和处理,以便执行特定的操作。 事件类型 1. 鼠标...

    兼容ie和firefox的鼠标经过(onmouseover和onmouseout)实现–简短版

    `onmouseover`事件在鼠标指针进入一个元素时触发,而`onmouseout`事件则在鼠标指针离开该元素时触发。这些事件在JavaScript中广泛用于创建交互式的用户界面,例如改变背景色、显示隐藏信息等。 在IE浏览器中,...

    javascript 触发事件列表

    ### JavaScript 触发事件列表详解 #### 一、单击事件(onclick) 当用户单击鼠标按键时触发的事件。通常,在HTML元素上定义`onclick`属性,该属性指定一个事件处理程序或一段代码,当点击事件发生时,这段代码将会被...

    鼠标悬浮事件(onmouseover、onmouseout)

    鼠标移上去显示别的东西,离开恢复原样;通过传递参数实现此功能

    js下关于onmouseout、事件冒泡的问题经验小结.docx

    ### JavaScript 下关于 `onmouseout` 与事件冒泡的问题经验小结 #### 一、引言 在前端开发过程中,事件处理是不可或缺的一部分。其中,`onmouseout` 事件和事件冒泡机制尤为关键,它们涉及到用户交互以及页面元素...

    JavaScript触发事件列表

    "JavaScript触发事件列表" JavaScript是一种广泛应用于Web开发的编程语言,它提供了许多事件处理机制,以便开发者能够捕捉和响应用户交互操作。下面是JavaScript触发事件列表,涵盖了常见的事件类型和应用场景: ...

    javascript onmouseout 解决办法.docx

    ### JavaScript `onmouseout` 解决方案详解 #### 引言 在前端开发中,我们经常需要处理用户与页面元素之间的交互行为。其中一种常见的需求是当用户的鼠标移出某个元素时,执行特定的操作,比如隐藏一个提示框或者...

    JS鼠标键盘触发函数大全

    ### JS鼠标键盘触发函数大全知识点解析 #### 一、鼠标事件 鼠标事件是JavaScript中最常见的交互方式之一,它们主要用于响应用户的鼠标操作。 - **`onClick`**:当用户单击鼠标左键时触发。该事件通常用于处理点击...

    [js]javascript事件集合(包有触发事件).pdf

    ### JavaScript事件集合知识点 ...以上是文档中提到的一些JavaScript事件集合知识点的总结,涵盖了事件的基本概念、触发方式、以及在开发中如何使用它们。掌握这些知识点对于进行高效的Web开发是十分关键的。

Global site tag (gtag.js) - Google Analytics