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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
跟我学习javascript的Date对象
Nov 19 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
Jun 13 Javascript
通过命令行生成vue项目框架的方法
Jul 12 Javascript
vue左右侧联动滚动的实现代码
Jun 06 Javascript
VUE实现可随意拖动的弹窗组件
Sep 25 Javascript
JS监听滚动和id自动定位滚动
Dec 18 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
May 12 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
Nov 09 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
浅析PHP绘图技术
2013/07/03 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
微信小程序异步处理详解
2017/11/10 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
Django实现组合搜索的方法示例
2018/01/23 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
团队队名口号大全
2014/06/06 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
消防隐患整改通知书
2015/04/22 职场文书
教师创先争优承诺书
2015/04/27 职场文书
2019中小学生安全过暑期倡议书
2019/06/24 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android