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 相关文章推荐
Web层改进II-用xmlhttp 无声息提交复杂表单
Jan 22 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
js中哈希表的几种用法总结
Jan 28 Javascript
jQuery中live()方法用法实例
Jan 19 Javascript
jQuery动态星级评分效果实现方法
Aug 06 Javascript
JS模拟实现Select效果代码
Sep 24 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
Java  Spring 事务回滚详解
Oct 17 Javascript
详解如何实现一个简单的 vuex
Feb 10 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
Dec 04 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中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
html读出文本文件内容
2007/01/22 Javascript
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
python生成IP段的方法
2015/07/07 Python
Python的标准模块包json详解
2017/03/13 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python实现堆排序的实例讲解
2020/02/21 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
Python如何对XML 解析
2020/06/28 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
Kenneth Cole官网:纽约时尚优雅品牌
2016/11/14 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
个人素质的自我评价分享
2013/12/16 职场文书
经典公益广告词
2014/03/13 职场文书
经济职业学院毕业生自荐书
2014/03/17 职场文书
大学班级学风建设方案
2014/05/01 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
教师三严三实心得体会
2014/10/11 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
警用民用对讲机找不同
2022/02/18 无线电