相对定位父子元素触发mouseover和mouseout事件实验

news/2024/5/12 3:21:10/文章来源:https://blog.csdn.net/cangkukuaimanle/article/details/18446223

最近做的一个项目中有个功能是鼠标移动到某一块id为A,然后A的子元素id为B在下方紧贴着父元素A显示出来,B里面的内容是鼠标移动到A元素上才请求服务端获取数据。

我使用了mouseover,mouseout事件,采用jquery的on方法。大致如下

$(document).on("mouseover","#A",function(){$(this).find("#B").css({"display":"block"});$.get("***",null,function(data){$(this).find("#B").html(data);})
});$(document).on("mouseout","#A",function(){$(this).find("#B").css({"display":"none"});
});
显示大概是下图这样

  可是TMD我发现我鼠标移动到A上出现B后,鼠标在两者间滑动,网络在不停的请求子元素的数据,也就是说在不停的触发A元素的mouseover事件,然后页面中就卡几下。

当时项目发布比较急,就没管,后来周末一大早,心头很闷,大冬天爬起来洗个澡打开电脑就开始研究这个问题。


第一步:

代码:

<script type="text/javascript" src="jquery.comjquery-1.10.2.min.js"></script>
<style>
#father
{width:200px;height:200px;background-color:red;position:relative;
}
#child
{display:none;position:absolute;left:0;top:199px;width:100px;height:100px;background-color:yellow;
}
#record
{width:300px;height:100px;border:1px solid blue;position:absolute;right:0;top:0;
}
</style>
<script>
$(document).on("mouseover","#father",function(e){$("#record").append("father mouseover</br>");$(this).find("div").css({"display":"block"});
});
$(document).on("mouseout","#father",function(e){$("#record").append("father mouseout</br>");$(this).find("div").css({"display":"none"});
});
</script>
<div id="father"><div id="child" ></div>
</div>
<div id="record" ></div>

我的鼠标从father元素滑入,出现了child元素,再从father元素滑到child元素中,出现如下情况


也就是说father元素先触发mouseover事件,当鼠标进入child元素后触发了mouseout事件,并且再次触发了mouseover事件。

这种情况只有一种解释,就是从father滑入child时,father元素触发了mouseout事件的,进入child元素触发了child的mouseover事件,并且通过事件冒泡,进而触发了father元素的mouseover事件。

第二步:

为了证实上述的解释,接下来做另一个实验。

<script type="text/javascript" src="jquery.comjquery-1.10.2.min.js"></script>
<style>
#father
{width:200px;height:200px;background-color:red;position:relative;
}
#child
{display:none;position:absolute;left:0;top:199px;width:100px;height:100px;background-color:yellow;
}
#record
{width:300px;height:100px;border:1px solid blue;position:absolute;right:0;top:0;
}
</style>
<script>
$(document).on("mouseover","#father",function(e){$("#record").append("father mouseover</br>");$(this).find("div").css({"display":"block"});
});
$(document).on("mouseout","#child",function(e){e.stopPropagation();$("#record").append("child mouseout</br>");
});
$(document).on("mouseover","#child",function(e){e.stopPropagation();$("#record").append("child mouseover</br>");
});
$(document).on("mouseout","#father",function(e){$("#record").append("father mouseout</br>");$(this).find("div").css({"display":"none"});
});
</script>
<div id="father"><div id="child" ></div>
</div>
<div id="record" ></div>

出现如下记录


动作和第一步中的动作一致,但是我使用了阻止冒泡,所以father元素就没有触发了第二次的mouseover事件,并且此时child元素由于father元素触发了mouseout事件将child的display设为none,并且在child触发了mouseover事件时没有冒泡触发father的此事件,所以没有将child的display设为block,所以child不再显示了。

也就是说当鼠标在father和child之间滑动时,是通过father不断的触发mouseover事件才使得child元素一直显示,其实是child一直在循环消失又再显示的过程,肉眼无法分辨,所以看到child会一直显示。

是不是这样呢?我们接着看

第三步:

代码:

<script type="text/javascript" src="jquery.comjquery-1.10.2.min.js"></script>
<style>
#father
{width:200px;height:200px;background-color:red;position:relative;
}
#child
{display:none;position:absolute;left:0;top:199px;width:100px;height:100px;background-color:yellow;
}
#record
{width:300px;height:100px;border:1px solid blue;position:absolute;right:0;top:0;
}
</style>
<script>
$(document).on("mouseover","#father",function(e){$("#record").append("father mouseover</br>");$(this).find("div").css({"display":"block"});
});
$(document).on("mouseout","#child",function(e){//e.stopPropagation();$("#record").append("child mouseout</br>");
});
$(document).on("mouseover","#child",function(e){//e.stopPropagation();$("#record").append("child mouseover</br>");
});
$(document).on("mouseout","#father",function(e){$("#record").append("father mouseout</br>");$(this).find("div").css({"display":"none"});
});
</script>
<div id="father"><div id="child" ></div>
</div>
<div id="record" ></div>

记录如下:


果然,我的动作依然是从father滑入,然后向下滑入到child元素内,触发的事件如上图所示。


到这里我已经明白我项目中的那个问题产生的原因,但是怎么解决呢,我希望在A和B元素间滑动时不要再重复请求服务端数据,可是A的mouseover事件在一直触发,怎么办呢?突然我想起了target....

第三步:


代码:

<script type="text/javascript" src="jquery.comjquery-1.10.2.min.js"></script>
<style>
#father
{width:200px;height:200px;background-color:red;position:relative;
}
#child
{display:none;position:absolute;left:0;top:199px;width:100px;height:100px;background-color:yellow;
}
#record
{width:300px;height:100px;border:1px solid blue;position:absolute;right:0;top:0;
}
</style>
<script>
$(document).on("mouseover","#father",function(e){$("#record").append("father mouseover,target:"+e.target.id+"</br>");$(this).find("div").css({"display":"block"});
});
$(document).on("mouseout","#child",function(e){//e.stopPropagation();$("#record").append("child mouseout,target:"+e.target.id+"</br>");
});
$(document).on("mouseover","#child",function(e){//e.stopPropagation();$("#record").append("child mouseover,target:"+e.target.id+"</br>");
});
$(document).on("mouseout","#father",function(e){$("#record").append("father mouseout,target:"+e.target.id+"</br>");$(this).find("div").css({"display":"none"});
});
</script>
<div id="father"><div id="child" ></div>
</div>
<div id="record" ></div>

同样的鼠标移动操作,产生结果如下:


target是某次事件触发的原始元素,也就是第一个触发此事件的元素,然后冒泡,引起上级元素触发此事件。

上图中清晰记录了事件触发的源头。“father mouseover,target:child”这条记录说明father的mouseover事件触发的源头是child。

那么在我的项目中的那个问题,我可通过触发事件的源头来决定是否请求服务端的数据,修改大致如下:

$(document).on("mouseover","#A",function(e){$(this).find("#B").css({"display":"block"});var flag=parseInt($("#C").val());if(e.target.id=="A"){$.get("***",null,function(data){$(this).find("#B").html(data);})}
});$(document).on("mouseout","#A",function(e){$(this).find("#B").css({"display":"none"});$("#C").val("true");
});









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

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

相关文章

相关网站(Github、个人博客等)的编程相关学习资源和可下载电子书导航,不定时更新

编程相关学习资源和可下载电子书项目导航&#xff0c;不定时更新 前言Python学习资源与书籍Python入门教程-By廖雪峰 -学习资源《Python进阶》-可下载电子书python深度学习入门 C#学习书籍 前言 作为广为人知的开源项目网址&#xff0c;Github已经被许多大牛玩出了花。理所当然…

爬虫练习——某网站上海房价分析

前言 实验数据来源自某看房网站&#xff0c;通过爬虫一共爬取了一千六百多条数据。能力有限&#xff0c;实验结果仅供参考。 该网站几乎没有什么反爬虫措施&#xff0c;原理很简单&#xff0c;所以关键就是定位自己想要的信息。 工具 1、爬虫工具&#xff1a;request&#x…

开源中国网站挂掉了...

现在是2013-08-24 18:48:19 有图为证&#xff1a;

基于C#和SQL SERVER的校园知识问答论坛网站的设计与实现

摘 要 本文使用Asp.Net Core 和MsSqlServer技术&#xff0c;详细说明开发校园知识论坛系统的开发。校园知识论坛系统是基本B/S模式的一种交互性极强的电子信息服务系统。它为使用者提供一个交流的平台&#xff0c;每一个用户都可以在上面问答知识&#xff0c;获取信息&#xff…

基于JavaScript和MySQL的文化平台网站的设计与实现

摘要 中国文化源远流长&#xff0c;自古就有文人雅士作诗赋词&#xff0c;舞文弄墨&#xff0c;尽显风雅。现今则有歌手作家思想成文&#xff0c;心绪为曲&#xff0c;亦现儒雅。文化是传承的&#xff0c;是流传不息的&#xff0c;也是众多人所追求的。从各种各样的文化中&…

基于Node.js中间层的微信图书借阅平台网站的设计与实现

1 引言 步入信息时代以来&#xff0c;互联网给人们的生活带来了翻天覆地的变化&#xff0c;互联网也不再简单地仅仅通过提供便利快捷的资讯服务来丰富我们的生活。互联网的出现打破了许多传统行业垄断的格局&#xff0c;互联网以其接入面广、信息即使、人人可参与等等性质&…

基于Keras和tensorflow深度学习Python实现的支持人脸识别和情绪分类的社区APP网站和微信小程序...

1 项目介绍 1.1 背景 视觉使人类得以感知和理解周边的世界&#xff0c;人的大脑皮层大约有 70%的活动在处理 视觉相关信息。计算机视觉即通过电子化的方式来感知和理解影像&#xff0c;以达到甚至超 越人类视觉智能的效果。 从 1966 年学科建立&#xff08;MIT&#xff1a;TheS…

基于php与sqlite数据库的运动社交网站

一、总体设计 1.1 开发环境 本系统采用php作为主要开发语言&#xff0c;服务端主要使用php&#xff0b;sqliteApache&#xff0c;客户端使用htmlcssjs。用Apache作为服务器&#xff0c;采用sqlite作为后台数据管理系统。 开发环境&#xff1a;Windows 10 开发工具&#xff1a;p…

[源码和文档分享]基于C#实现的电影网站数据爬虫和电影网站

1 简介 1.1 背景 随着网络的发展&#xff0c;网购也越来越流行&#xff0c;人们可以在去各大电影院的网站方便的购票并选择自己喜欢的时间去影院观看。但电影院网站众多&#xff0c;人们可能为了寻找一个电影而奔波与各大网站&#xff0c;导致浪费大量时间在寻找电影资源上。本…

[源码和文档分享]基于JAVA FX实现的酒店预订系统网站

1 产品概述 参考酒店预订系统用例文档和酒店预订系统软件需求规格说明文档中队产品的概括描述。酒店预订系统主要是应用于网上预定远程酒店订单的在线系统&#xff0c;主要功能见用例图如下。 源码下载地址&#xff1a;https://www.write-bug.com/article/1441.html

[源码和文档分享]基于PHP和MYSQL数据库实现的公共考试报名管理系统网站

前 言 随着社会的快速发展&#xff0c;体力不再是我们唯一的生存方式了&#xff0c;人们也越来越注重自身的文化素养&#xff0c;随之而来的也有许多成人考试&#xff0c;为已经步入社会的人提供一个再学习的机会。 众所周知&#xff0c;作为学生&#xff0c;考试是我们必经的过…

[源码和文档分享]基于Python的Django框架实现的中式快餐厅管理信息系统网站

1 初步调研 随着餐饮业的连锁和国外餐饮巨头的进入&#xff0c;餐饮业的竞争将越来越激烈&#xff1a;要想在竞争中处于不败之地&#xff0c;必须在管理、服务等方面提高服务管理意识。面对当前餐饮业普遍的产业化程度低&#xff0c;管理手段、管理技术落后等问题&#xff0c;使…

[源码和文档分享]基于PHP和MYSQL数据库实现的libilibi电影论坛网站

一、需求分析 1.1 需求描述 1.1.1 用户相关功能 登录&#xff1a;前端输入用户名和密码&#xff0c;在数据库中完成查询&#xff0c;如果存在该用户&#xff0c; 则登陆成功&#xff0c;继续其他操作&#xff1b;如果不存在&#xff0c;则登录失败&#xff0c;提示用户名/密码错…

基于ASP.NET和SQL SERVER数据库的招聘网站设计与实现

摘 要 本课题是基于互联网与数据库技术的网上招聘网站&#xff0c;是先进的计算机科学技术和现代招聘理念相结合的产物&#xff0c;通过使用以ASP.NET技术为基础&#xff0c;基本实现网上招聘网站的基本功能&#xff0c;满足了求职者和招聘企业的需求&#xff0c;实现了招聘单位…

央视看上绿色P2P网站

4月18日&#xff0c; 2008国际III联竞走挑战赛在北京"鸟 巢"正式启动。借此契机&#xff0c;悠视网(UUSee. com)与 IBTV合作走进"鸟巢"&#xff0c;进行长达7个小时网络直 播&#xff0c;吸引了诸多网友的H光。 悠视网采用新一代P2P传输技术和卫星宽带…

PHP网站的网页产生中文乱码的解决办法(以zend studio为例)

PHP网站的网页产生中文乱码的解决办法&#xff08;以zend studio为例&#xff09; 乱码原因很多&#xff0c;主要是因为多系统之间不协调&#xff0c;现阶段让源文件同浏览器编码一致&#xff0c;基本上能解决问题。 网页上显示乱码 很多人的解决方法是在PHP文件头添加下面的…

静静网站流量分析项目_0

最近打算把大数据从日志收集&#xff0c;数据存储&#xff0c;数据清洗处理&#xff0c;数据导出&#xff0c;可视化展示进行一个整合,汇总到静静网站流量分析项目&#xff0c;本篇先对该项目做一个简单的介绍。 1.业务背景 网站流量统计是改进网站服务的重要手段之一&#xf…

PHP使用Apache中的ab测试网站的压力性能

打开Apache服务器的安装路径(我用的是 WampServer)&#xff0c;在bin目录中有一个ab.exe的可执行程序&#xff0c;它就是要介绍的压力测试工具。 在Windows系统的命令行下&#xff0c;进入ab.exe程序所在目录&#xff0c;执行ab.exe程序。注意直接双击无法正确运行。 d:(回车/进…

Flash脚本语言as学习扎记-摘自某小学网站

小学里头出现Flash的AS学习笔记..真让长天汗颜! AS基础-----------------------------------做过Flash动画的Flash爱好者们都知道&#xff0c;要做好一个Flash动画&#xff0c;AS是必不可少的&#xff0c;即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简…

网站使用国外空间或服务器[转载]

网站使用国外空间或服务器不会影响收录及排名 由于备案制度变更、价格等多方面的因素&#xff0c;从去年开始多数站长选择使用国外空间。 一个大家关注较多的问题就是&#xff0c;使用国外主机对SEO有影响吗?在许多站长平台以及论坛都是一个比较热门话题。目前网上对于这个问题…