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 相关文章推荐
广告显示判断
Aug 31 Javascript
php gethostbyname获取域名ip地址函数详解
Jan 24 Javascript
网站页面自动跳转实现方法PHP、JSP(下)
Aug 01 Javascript
JS函数验证总结(方便js客户端输入验证)
Oct 29 Javascript
javascript中使用正则计算中文长度的例子
Apr 29 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
Apr 15 Javascript
javascript属性访问表达式用法分析
Apr 25 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
JS动态生成年份和月份实例代码
Feb 04 Javascript
vue.extend与vue.component的区别和联系
Sep 19 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
Nov 28 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 面向对象 final类与final方法
2010/05/05 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
微信小程序scroll-view仿拼多多横向滑动滚动条
2020/04/21 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
Python的mysql数据库的更新如何实现
2017/07/31 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python自动下载图片的方法示例
2020/03/25 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
高中校园广播稿
2014/10/21 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
七年级上册生物的课件
2019/08/07 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
解决golang结构体tag编译错误的问题
2021/05/02 Golang
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python