javascript中onmouse事件在div中失效问题的解决方法


Posted in Javascript onJanuary 09, 2012

也就是说,移到对象的子对象上,也算onmouseout了。但这往往会达不到我们想要的预期效果。这是由于javascript自身的冒泡特性导致的(即在子元素上触发了事件,并冒泡到了父元素-堆栈后进先出算法)。今天在网上搜了一下,找了以下的解决办法(兼容IE和Firefox)。
在IE下解决问题很简单,用onMouseEnter、onMouseLeave来代替onMouseOver、onMouseOut就行了,他们的作用基本相同,但前者不会发生冒泡(如果用 jQuery的event事件,只要绑定mouseleave、mouseenter即可)。但firefox下并没有onMouseEnter、onMouseLeave这两个事件。那么只能使用纯js来解决IE及Firefox的兼容性问题了:
原理:通过判断触发onMouseOut事件后,鼠标到达的元素是不是包含在父元素信息栏(div)内,如果是就表示鼠标还在信息栏(div)上,则不隐藏。如果否就表示鼠标真的移出了信息栏(div),那么信息栏就要隐藏。

// 首先来获取触发onMouseOut事件的元素,IE下通过event的toElement属性来获得,firefox下通过event的relatedTarget属性来获得。 
IE:event.toElement ,Firefox:event.relatedTarget(注意:Firefox下的event须通过在函数调用时传入,而IE下的event则可以直接通过window.event系统对象来获得) 
// ① 接下来就是判断获取的元素是否是主体div的子元素(IE下可以通过元素的obj.contains(element)方法来判断,但Firefox下没有这个方法,所以需要给firefox定义元素的obj.contains()方法)。 
代码如下: 
if(typeof(HTMLElement)!="undefined") // 给firefox定义contains()方法,IE已经系统自带有这个方法了 
{ 
HTMLElement.prototype.contains=function(obj) { 
while(obj!=null&&typeof(obj.tagName)!="undefind") { // 通过循环对比来判断是不是obj的父元素 

 if(obj==this) { return true; } 


 obj=obj.parentNode; 

 } 
return false; 
}; 
} 
// ② 获取和判断搞定后,我们就可以通过判断IE和Firefox来针对处理了,通过navigator.userAgent来判断浏览器类型: 
if(navigator.userAgent.indexOf("MSIE")>0) { 
return "MSIE"; 
} 
if(navigator.userAgent.indexOf("Firefox")>0){ 
return "Firefox"; 
} 
// ③ 到此为止所有要解决的问题都得到了解决,当触发onMouseOut事件时,我们将针对不同的浏览器先获取鼠标到达的元素,然后通过判断该元素是否在信息栏(div)内,如果元素是子元素,那么不执行onMouseOut事件,反之则执行事件,隐藏信息栏,完成后的代码如下: 
function hideMsgBox(theEvent){ //theEvent用来传入事件,Firefox的方式 
  if (theEvent){ 
  var browser=navigator.userAgent; //取得浏览器属性 
  if (browser.indexOf("Firefox")>0){ //如果是Firefox 

 if (document.getElementById('MsgBox').contains(theEvent.relatedTarget)) {//如果是子元素 

 return; //结束函数 
} 
} 
if (browser.indexOf("MSIE")>0){ //如果是IE 
if (document.getElementById('MsgBox').contains(event.toElement)) { //如果是子元素 
return; //结束函数 
} 
} 
} 
/*要执行的操作(如:隐藏)*/ 
document.getElementById('MsgBox').style.display='none' ; 
…… 
} 
// ④ 在信息栏(Div)上设置onMouseOut=hideMsgBox(event)来调用。

另外,通过设置window.event.cancelBubble = true (IE) ,event.stopPropagation() event.preventDefault() (Firefox) 也可以解决问题,但是需要遍历所有子元素,影响效率,所以还是在触发onMouseOut事件时再进行上述判断分别处理比较合适。
Javascript 相关文章推荐
function, new function, new Function之间的区别
Mar 08 Javascript
js简单实现删除记录时的提示效果
Dec 05 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
Jan 31 Javascript
js限制文本框的输入内容代码分享(3类)
Aug 20 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
vue.js声明式渲染和条件与循环基础知识
Jul 31 Javascript
vue组件实现文字居中对齐的方法
Aug 23 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
Vue中this.$nextTick的作用及用法
Feb 04 Javascript
详细介绍解决vue和jsp结合的方法
Feb 06 Javascript
vue 在methods中调用mounted的实现操作
Aug 07 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
jQuery 阴影插件代码分享
Jan 09 #Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 #Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 #Javascript
分享几个超级震憾的图片特效
Jan 08 #Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 #Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 #Javascript
人人网javascript面试题 可以提前实现下
Jan 05 #Javascript
You might like
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
2010/06/04 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
基于php判断客户端类型
2016/10/14 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
HTML node相关的一些资料整理
2010/01/01 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
windows上安装Anaconda和python的教程详解
2017/03/28 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
python3 拼接字符串的7种方法
2018/09/12 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
Python读取stdin方法实例
2019/05/24 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
关于礼仪的演讲稿
2014/01/04 职场文书
家装电话营销开场白
2015/05/29 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA