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 相关文章推荐
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
JQuery 应用 JQuery.groupTable.js
Dec 15 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
判断文件是否正在被使用的JS代码
Dec 21 Javascript
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
javascript冒泡排序小结
Apr 10 Javascript
jQuery Validate设置onkeyup验证的实例代码
Dec 09 Javascript
js实现下拉框效果(select)
Mar 28 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
Dec 06 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
VueJs监听window.resize方法示例
Jan 17 Javascript
详解性能更优越的小程序图片懒加载方式
Jul 18 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
php使用PDO方法详解
2014/12/27 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
如何在PHP中生成随机数
2020/06/04 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python中datetime模块参考手册
2017/01/13 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
食品安全处置方案
2014/06/14 职场文书
导游词之湖北武当山
2019/09/23 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
MySQL GRANT用户授权的实现
2021/06/18 MySQL
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
Python 全局空间和局部空间
2022/04/06 Python
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers