JS中onmouseover与onmouseout的bug

在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内核的浏览器,我现在试了一个兼容性很是很好的,可以尝试使用噢!

        

时间: 2024-08-05 23:16:10

JS中onmouseover与onmouseout的bug的相关文章

onmouseover和onmouseout的bug

脑子不好用了,一点东西要看几遍才能记住,学过的东西也要好几遍,悲哀. 习惯了jquery的hover,或者看过hover源码,或者是正美的<框架设计>,onmouseover和onmouseout的bug问题,不过对于我等脑子不好用的,还是几个无bug的问题吧,看代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> #div1{ width:

[js]uploadify结合jqueryUI弹出框上传,js中的冒出的bug,又被ie坑了

引言 最近在一个项目中,在用户列表中需要对给没有签名样本的个别用户上传签名的样本,就想到博客园中上传图片使用弹出框方式,博客园具体怎么实现的不知道,只是如果自己来弄,想到两个插件的结合使用,在弹出框中使用uploadify插件进行上传,每次都会报错很是无语,最后找到解决方案,这里记录一下,算是对工作中遇到的bug的一个总结. bug 这是vs调试状态下,显示的信息.在浏览器端,点击第一次上传按钮,正常,将弹出框关闭后,第二次打开,就会出现问题: 第一次单击上传: 第二次,关闭弹出框,再次单击上传

关于onmouseover和onmouseout的bug

总结了一下关于使用onmouseover以及onmouseout会出现的bug 首先简单的布局: <div id="box"> <div>这是一个内容</div> </div> 简单写了一下样式,效果如下: js代码如下: var oBox = document.getElementById("box"); oBox.onmouseover = function(){ alert("移入"); }

onmouseover 和onmouseout 的bug解决方案

每次在写移入移出事件的时候,就会出现bug,在IE下会闪,感觉像是在多次执行. 解决的方案: 写一个移入demo: oBox.onmouseover=function(ev){ var oEvent=ev||event; var oFrom=oEvent.fromElement||oEvent.relatedTarget; if(oBox.contains(oFrom)){ return; } alert('移入'); }; 移出与移入类似,只是把fromElement改成toElement就可

使用node.js中遇到的一些小bug

1.BUG Cannot set headers after they are sent to the client 解决:即发出一次请求得到两次或以上的回应时会出现此警告,此时注意查看再在一些条件下是否有使用return终止请求 2.地址栏怪异问题....id=%209 在html中查看时链接是这样的 但当点击跳转时,网址栏却是这样的 该问题是由于在"id= 20" 中存在了空格,将空格去掉之后就可以解决问题 3.使用express时候req.query()提示 query is n

js中hover事件时候的BUG以及解决方法

hover事件是我们在开发前段时候遇到的稀松平常的问题,但是有没有发现会出现有一个BUg,比如,你移动到一个元素上,让它执行一个方法,然后你快速的移入移出的时候,他会进行亮瞎你眼睛的频闪效果,而且跟得了老年痴呆一样会进行延时显示,24K钛合金也会被闪瞎的,鼠标重复在相应区域滑动的时候,动画会一直执行,直到和鼠标经过的次数相同位置.比如鼠标移进3次,移出3次,动画就会出现三次.这显然是极度影响用户体验的.然后我们公司大后端告诉我说把mouseevent和monseleave合并成一个hover事件

有效解决js中添加border后动画bug问题

做了个demo发现如果一个div不加border属性,用对象的offsetWidth属性来控制width没问题,但是如果一旦加了border属性,问题就来了. 其实offsetWidth属性获取的的是div内容宽度加内外边距和边框的宽度总和,所以为了更好地解决这个bug,自己弄了一个getStyle方法来有效的解决这个bug.以下是代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset

JS中的call、apply、bind方法

JS中的call.apply.bind方法 一.call()和apply()方法 1.方法定义call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj.

js中的事件 bom对象 dom对象.

3.事件 什么是事件?为什么使用事件? 我们学习事件首先了解一些概念 事件源 事件 监听器 事件源:事件的源头(也就是这个事件是由某某触发的,那么我们就管其叫事件源) 监听器:监听事件发生的组件.那么监听器要想监听事件是否发生,必须注册监听(绑定监听) js中常用的事件 1.onclick 鼠标点击某个对象 我们在开发中一般会对按钮,文本框或radio checkbox等进行onclick操作. 2.onblur 失去焦点 3.onfocus 获去焦点 4.onchange 改变域的内容 针对于