解决内部元素onMouseOver/onMouseOut事件冒泡触发父元素的相应事件

news/2024/5/11 0:18:11/文章来源:https://blog.csdn.net/weixin_33860553/article/details/85867283

前阵子为BS项目模板做了一个左侧滑动信息栏,效果类似于windows状态栏的自动隐藏效果,鼠标移进滑出,鼠标移出隐藏,浮动时不占用空间,也可以固定住占一块位置。做的过程中遇到一个问题,鼠标在信息栏内部移动时会触发onMouseOut事件,信息栏放在div中,内部有table、img、a等元素,看来是由于事件冒泡,子元素上触发了事件冒泡到了父元素,导致滑动时不断闪动,头晕眼花,于是着手解决问题。

 


方法一:

在IE下解决问题很简单,用onMouseEnter、onMouseLeave来代替onMouseOver、onMouseOut就行了,他们的作用基本相同,前者不会发生冒泡。但是firefox下没有这两个事件,公司BS项目模板要同时兼容IE和firefox,没办法,只能再找别的方法(多浏览器分天下的年代,解决问题总是没那么简单......(/_\)!)


方法二:
有一个在IE和firefox下都行得通的解决思路,通过判断触发onMouseOut事件后鼠标到达的元素是不是包含在父元素(信息栏Div)内,如果是就表示鼠标还在信息栏上,则不隐藏,如果否就表示鼠标真的移出了信息栏,那么信息栏隐藏,思路有了,那么就一步步来解决问题

首先来获取触发onMouseOut事件的相关元素,IE下event的属性toElement来获得,在firefox下变成了relatedTarget(相关元素)
IE:event.toElement    Firefox:event.relatedTarget(注意Firefox下event须要调用函数时传入)

接下来就是判断获取的元素是否是子元素,IE下通过元素的contains(Element)方法可以判断,同样的firefox下没有这个方法!!,不过可以给firefox下的元素定义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;  //结束函式
                          }
                   }
             }
            /*要执行的操作*/
 }

在信息栏(Div)上设置onMouseOut=hideMsgBox(event)来调用,圆满解决冒泡问题。

方法三:
事实上通过设置
window.event.cancelBubble = true (IE)   event.stopPropagation()  event.preventDefault() (Firefox)
也可以解决问题,但是需要遍历所有子元素,影响效率,所以还是在触发onMouseOut事件时再进行上述判断分别处理比较合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_769579.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做网站选择虚拟主机好是服务器,做网站选择虚拟主机还是服务器

选择虚拟主机?还是合租服务器?抑或是租用独立服务器?很多站长朋友们有时很迷茫,不知道是选择虚拟主机好,还是合租服务器好,或者是租用独立服务器。首先我们来分析下这三者的优缺点和一些联系,再…

Step by Step WebMatrix网站开发之二:使用WebMatrix(2)

上一篇,从Web库创建了一个电子商务的网站。现在回到WebMatrix,看看它有什么功能。 由图1可以看到,WebMatrix主要有3个区域,顶部Ribbon区域,左边是功能区域,右边是信息或编辑区域。Ribbon区域的工具按钮会根…

学习及工具网站推荐

目录1、视频教学1.1、遇见狂神说的Java全栈课程1.2、B站2、学习文档2.1、现代 JavaScript 教程3、前端框架3.1、开源模块化前端UI框架3.2、渐变背景CSS样式4、编程学习及算法练习4.1、力扣(LeetCode)4.2、洛谷5、素材及资源5.1、站长素材(各种…

腾讯云服务器安装宝塔面板快速配置LNMP/LAMP网站系统

我们在选择购买腾讯云服务器之后,有部分用户肯定是用来建站用途的。毕竟云服务器的性能和功能比虚拟主机优秀很多。腾讯云服务器拥有香港、北京、广州、上海、美国等多个机房,可以安装Linux和Windows系统。对于VPS、服务器初级用户肯定直接安装面板在服务…

免费制作云图的网站(可以从文章中提取关键字)

最近在做一个报告,需要用到云图。不失所望,经过寻找,找到一个国外免费好用的云图制作网站。 网站地址是:https://worditout.com/word-cloud/create 利用worditout制作云图的步骤是: 1.输入文本,&#xf…

斥资75元,我搭建了自己的博客网站

1.背景 1.1.执念 搭建网站是一直想做的事。读大学时,曾用阿里云搭建了一个网站,但是第二天就无法访问(没备案)。 当时想到即使搭建好了,网站上也没有内容可以放,这件事也就翻篇了。 1.2.教做人 做公众号也已经一个月了&#…

网站文章采集与伪原创技巧

网站文章原创与伪原创,一直都是seo行业中比较具有争议的问题,我们国内网站大多数做的都是百度的seo,因为百度的用户群体是国内占比最高的,百度建议大家做原创的网站内容的,所以多数的朋友都坚持每天的更新原创文章&…

去除chrome网站https的安全检测

chrome://net-internals/#hsts 访问该网址,把要禁止检测的网址放在下面: 转载于:https://www.cnblogs.com/xiaozhumaopao/p/11005282.html

HTML常用模板:用DIV实现网站首页、后台管理首页(整理)

1. 说明 网上下载的模板,用DIV实现页面模块之间的分隔(不是用frameset/frame)。可以选择有无header/menu/footer,主体如何等等。删除了几个我认为重复的。重新命名而已。这样看文件夹就知道该目录是何种风格的模板。 附件中的文件…

探测网站(四)burp suite暴力猜解密码

2019独角兽企业重金招聘Python工程师标准>>> burp suite的intruder模块用来自动探测Web应用程序,我们可以用它来暴力猜解用户名和密码。首先准备用户名和密码字典,这个网上可以用csdn、天涯、人人等泄露的用户名和密码,也可以用字…

JMS-使用消息队列优化网站性能

为什么80%的码农都做不了架构师?>>> 在当今互联网和电商盛行的情况下,网站的性能受到了极大地挑战。大数据,高并发成为大型网站的标志。无论淘宝的双11优惠,还是小米抢购,它们都有一个共同的特点&#xff…

PHP识别电脑还是手机访问网站

为什么80%的码农都做不了架构师&#xff1f;>>> <?php function isMobile(){ $useragentisset($_SERVER[HTTP_USER_AGENT]) ? $_SERVER[HTTP_USER_AGENT] : ; $useragent_commentsblockpreg_match(|\(.*?\)|,$useragent,$matches)>0?$matches[0]:; …

网站首页轮番图的后台管理

如下图&#xff0c;很多CMS的首页都会有实时更新的轮番图的需求&#xff1a; 最近在做一个CMS的过程中&#xff0c;就遇到了这样的需求。 之前曾经做过一个校园网站的项目&#xff08;自己做着玩玩&#xff09;&#xff0c;但前台的轮番图是写死在页面上的&#xff0c;即&#…

Https网站中请求Http内容

Https网站中请求Http内容Https网站中无法请求Http资源&#xff08;静态资源、接口等&#xff09;分析解决方法Https网站中无法请求Http资源&#xff08;静态资源、接口等&#xff09; 今天遇到个问题&#xff1a;Mixed Content: The page at ‘https://*****’ was loaded over…

Windows server 2012配置WebDeploy发布网站

以前都是使用win2008r2服务器&#xff0c;最近更新了操作系统到WINDOWS 2012,发现以前的做法已经不适用了。 win2008r2配置WebDeploy&#xff1a; https://www.cnblogs.com/xcsn/p/7067841.html 下面直接进入主题 一、下载安装 1.下载web平台组件 2.安装 先安装WEB DEPLOY 3.5&…

网站日志分析诊断及其作用

相信大家都知道网站日志是什么东西&#xff0c;可是做SEO的有多少人会去关注分析网站日志呢&#xff0c;又有多少SEOer能看懂网站日志呢&#xff1f;今天就给大家讲解下在网站SEO优化中&#xff0c;怎样利用网站日志的诊断和分析来提高网站关键词的排名。 首先我们仙说下网站日…

设计师升职加薪必须知道的10个设计网站

设计行业经过几年的发展&#xff0c;已经进入到了相对成熟的时期。这无疑会对设计师有更高的要求和挑战。随着AI的发展&#xff0c;设计甚至从有形的设计&#xff0c;转变为无形的设计。这就需要你对设计有更深刻的理解&#xff0c;理解设计的本质是沟通&#xff0c;设计源于人…

阿里云--域名,主机,备案都配置好了,就是不能访问网站的解决方案

异常处理汇总 ~ 修正果带着你的Net飞奔吧&#xff01;http://www.cnblogs.com/dunitian/p/4599258.html 1.解析问题&#xff1a;参考这个文章&#xff1a;http://www.cnblogs.com/dunitian/p/4977261.html 2.主机设置问题&#xff1a; 主机管理 http://cp.aliyun.com/ 主机里面…

网站跳转劫持漏洞的发现与修复建议

2019独角兽企业重金招聘Python工程师标准>>> 网站渗透测试是指在没有获得网站源代码以及服务器的情况下&#xff0c;模拟入侵者的攻击手法对网站进行漏洞检测&#xff0c;以及渗透测试&#xff0c;可以很好的对网站安全进行全面的安全检测&#xff0c;把安全做到最大…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书&#xff0c;就应该有所收获&#xff0c;有所总结&#xff0c;最近把《大型网站技术架构》一书给看完了&#xff0c;给人的印象实在深刻&#xff0c;再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…