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

news/2024/5/10 2:10:43/文章来源:https://blog.csdn.net/weixin_34283445/article/details/92833491

前阵子为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事件时再进行上述判断分别处理比较合适。

转载于:https://www.cnblogs.com/as3lib/p/6579954.html

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

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

相关文章

用WP Super Cache和七牛为你的WordPress网站加速

众所周知,WordPress一直都是博客建站的首选程序,而现在也有越来越多的企业网站都选择采用WordPress来搭建。 WordPress虽好但其过于臃肿且响应速度慢等缺点也为站长们所诟病,目前网上介绍为WordPress加速的方法五花八门,各有各的优…

《网站建设与网页设计从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript》——3.3 添加文本元素...

本节书摘来自异步社区《网站建设与网页设计从入门到精通DreamweaverFlashPhotoshop+HTMLCSSJavaScript》一书中的第3章,第3.3节,作者: 何新起 更多章节内容可以访问云栖社区“异步社区”公众号查看。 3.3 添加文本元素 网站建设与…

《大型网站服务器容量规划》一3.1 通过监控规划容量

本节书摘来异步社区《大型网站服务器容量规划》一书中的第3章,第3.1节,作者: 郑钢 责编: 张涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。 3.1 通过监控规划容量 任何一家互联网公司都会有自己的运维系统…

Web层框架对网站中所有异常的统一处理

一个网站的异常信息作为专业的人士,是不会轻易暴露给用户的,因为那样狠不安全,显得你漏是一回事,只要还是考虑到网站的数据安全问题,下面给大家分享一下一些常见的web层框架是如何处理统一的异常。 之前都是在Struts2…

如何使用AppScan扫描大型网站

经常有客户抱怨,说AppScan无法扫描大型的网站,或者是扫描接近完成时候无法保存,甚至保存后的结果文件下次无法打开?;同时大家又都很奇怪,作为一款业界出名的工具,如此的脆弱?是配置使用不当还是…

当SEO/SEM与良知正面碰撞

先从这几天一直很火的大学生“魏则西之死”这篇文章说起,虽然这对死者很不敬,但如果可以让我们深刻反省的话也是值得的,从知乎到4.28号这篇文章在微信被疯狂转载之后火速占领各大新闻版块头条,首先我们来看一下消息的源头&#xf…

VS2005在开发网站时的一个编译BUG

这两天我在用C#做一个WEB网站,用的是VS2005,碰到一个编译问题,害我查了很长时间,终于找到原因了-_- 放上来,如果有碰到相同问题的兄弟正好看看。现象:编译时,当页面对应的cs文件有错误时&#…

Bootstrap相关网站中简单的等待提醒

一、在页面中加入如下代码 <div class"modal fade" tabindex"-1" role"dialog" id"waitingModal"><div class"modal-dialog" role"document"><div class"modal-content"><div cla…

服务器网站访问ftp设置,服务器网站访问ftp设置方法

服务器网站访问ftp设置方法 内容精选换一换公网域名解析是基于Internet网络的域名解析过程&#xff0c;可以把人们常用的域名(如www.example.com)转换成用于计算机连接的IP地址(如1.2.3.4)。公网域名解析支持通过直接在浏览器中输入域名&#xff0c;访问网站或Web应用程序。云解…

服务器启动文件夹,win10系统开机启动文件夹的路径是什么_网站服务器运行维护...

装 k8s 要先装 Docker 吗&#xff1f;_网站服务器运行维护装k8s是不需要先装Docker&#xff0c;两者之间是没有依赖关系的&#xff0c;都是可以独立运行&#xff0c;但是两者是可以配合使用的&#xff0c;Docker是一个独立的应用程序&#xff0c;可以安装在任何计算机上运行容器…

不蒜子实现网站访问量访客数统计

个人博客网站&#xff1a;http://zhangchuanjun.cn 或者&#xff1a;我个人网站 有许多网站分析工具&#xff0c;比如百度统计&#xff0c;谷歌分析等工具&#xff0c;这类工具虽然有不错的网站统计功能&#xff0c;但是都不能呈现在自己的网站上&#xff0c;都需要进入相应的后…

使用CDN为您的网站加速(一)

CDN(Content Delivery Network)翻译为内容分发网络&#xff0c;是通过在现有的 Internet 中增加一层新的网络架构&#xff0c;将网站的内容发布到最接近用户的网络 " 边缘 " &#xff0c;使用户可以就近取得所需的内容&#xff0c;解决 Internet 网络拥塞状况&#x…

Flask开发微电影网站(五)

后台管理页面是系统管理员登录后对网站进行管理的前端页面 后台登录页面&#xff0c;如下图所示 管理员登录后的页面&#xff0c;如下图所示 管理员登录后&#xff0c;在右上角显示的管理员信息&#xff0c;如下图所示 管理员登录后&#xff0c;在页面中间部分的左侧显示管理菜…

监控.net 网站 Glimpse

使用Nuget 安装Glimpse 安装好后&#xff0c;config会默认添加几个节点 安装好之后 只需要浏览器输入 网站/Glimpse.axd 再次进入网站 就可以查看&#xff08;ajax sql session 等&#xff09; 转载于:https://www.cnblogs.com/jayblog/p/9324672.html

本地搭建网站--PHP网站

背景&#xff1a;组内需要一个博客系统记录些文档、同时扫盲学习mysql、PHP、域名相关知识点、RFS学习演练 方案&#xff1a;phpnow emlog 一、PHPnow 提供PHP网站环境&#xff08; 服务器 数据库 主机空间&#xff09; 傻瓜式安装 主站&#xff1a;http://servkit.org/ 注&a…

在服务器上搭建多个WordPress博客网站教程(超级详细)

实验准备 一台阿里云服务器二个域名&#xff08;IP与域名已经建立解析关系&#xff09;Linux关于web架构的知识 实验步骤 1.用crt远程登录阿里云服务器 2.安装nginx&#xff0c;mysql&#xff0c;php 建议使用lnmp一键安装包安装&#xff0c;方便快捷 获取lnmp一键安装包链接 l…

网站建设指南之网站HTTPS化与证书

通常我们说的HTTPS就是HTTPSSL证书&#xff0c;简单的说就是HTTP的安全版。HTTP网站的数据传输都是以明文形式&#xff0c;比如用户密码等信息都没有加密&#xff0c;很容易造成信息泄露。绑定SSL证书后&#xff0c;可以实现网站HTTPS化&#xff0c;加密用户与网站之间的交互访…

bae部署php网站,thinkphp部署bae的相关配置

thinkphp3.2.3发布到bae3.0&#xff0c;在tp的config.php中设置URL_MODEL1&#xff0c;入口文件index.php中设置define(BIND_MODULE,Home);// 绑定Home模块到当前入口文件define(BIND_CONTROLLER,Index);// 绑定Index控制器到当前入口文件这样在xampp中调试可以直接是localhost…

linux新加网站,linux云主机如何添加网站?

如何在云主机上添加网站?云主机也是有不同的操作系统区分的&#xff0c;比如Windows跟Linux等等&#xff0c;这两种是比较多人选择的云服务器系统。那么&#xff0c;今天万变云给大家带来在linux云主机上进行网站添加的教程。以下配置的路径以网站云提供的标准环境路径为准&am…

html网站栏目列表,栏目列表页.html

&#xfeff;栏目列表页$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resources/reload.html; …