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 相关文章推荐
使用EXT实现无刷新动态调用股票信息
Nov 01 Javascript
按下回车键指向下一个位置的一个函数代码
Mar 10 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
Aug 02 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
ES6 更易于继承的类语法的使用
Feb 11 Javascript
jQuery创建折叠式菜单
Jun 15 jQuery
jquery实现商品sku多属性选择功能(商品详情页)
Dec 20 jQuery
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
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
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
完美解决PHP中文乱码
2009/11/26 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
nodejs模块学习之connect解析
2017/07/05 NodeJs
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
python实现简单flappy bird
2018/12/24 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
python中rb含义理解
2020/06/18 Python
python批量修改交换机密码的示例
2020/09/22 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
优秀共产党员先进事迹
2014/01/27 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
禁烟标语大全
2014/06/11 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
会计师事务所实习证明
2014/11/16 职场文书
《假如》教学反思
2016/02/17 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
MySQL连接控制插件介绍
2021/09/25 MySQL