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 相关文章推荐
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
May 23 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
Jun 18 Javascript
jquery ui bootstrap 实现自定义风格
Nov 14 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
Mar 29 Javascript
JavaScript实现页面跳转的方式汇总
May 16 Javascript
HTML的select控件美化
Mar 27 Javascript
在vscode里使用.vue代码模板的方法
Apr 28 Javascript
layui 优化button按钮和弹出框的方法
Aug 15 Javascript
ES6 更易于继承的类语法的使用
Feb 11 Javascript
js原生map实现的方法总结
Jan 19 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
Jan 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
56.com视频采集接口程序(PHP)
2007/09/22 PHP
php5中类的学习
2008/03/28 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
jquery图片上下tab切换效果
2011/03/18 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
理解python多线程(python多线程简明教程)
2014/06/09 Python
python开发中range()函数用法实例分析
2015/11/12 Python
python3设计模式之简单工厂模式
2017/10/17 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
自我推荐书
2013/12/04 职场文书
教师师德承诺书
2014/03/26 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python