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 相关文章推荐
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
Apr 27 Javascript
Checbox的操作含已选、未选及判断代码
Nov 07 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
Feb 10 Javascript
原生javascript实现自动更新的时间日期
Feb 12 Javascript
修改jquery中dialog的title属性方法(推荐)
Aug 26 Javascript
详解javascript事件绑定使用方法
Oct 20 Javascript
jQuery控制元素隐藏和显示
Mar 03 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
微信小程序实现登录注册tab切换效果
Dec 29 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
js仿京东放大镜效果
Aug 09 Javascript
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
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php三元运算符知识汇总
2015/07/02 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
基于jquery的动态创建表格的插件
2011/04/05 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
layui 弹出删除确认界面的实例
2019/09/06 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
举例讲解Python中装饰器的用法
2015/04/27 Python
简单了解Django ContentType内置组件
2019/07/23 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
pycharm快捷键汇总
2020/02/14 Python
python爬虫可以爬什么
2020/06/16 Python
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
《湘夫人》教学反思
2014/02/21 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
灰雀教学反思
2014/04/28 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
校园演讲稿汇总
2014/05/21 职场文书
公务员诚信承诺书
2014/05/26 职场文书
汽车维修求职信
2014/06/15 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
光荣之路观后感
2015/06/12 职场文书
升学宴家长致辞
2015/07/27 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL