使用事件冒泡原理控制菜单或浮层
在开发WEB中,经常碰到这样一种需求:点击页面中的某个按钮或链接是弹出一个菜单或者是浮层,并且点击该按钮或者链接以外的区域时,菜单或浮层消失。以前没有了解过事件冒泡的时候,使用很多JS代码来实现这样的效果;本人最常用的方法是在该链接上添加一个特殊的属性以及唯一的一个属性值,然后在body上绑定单击事件,触发事件是获取该事件的源节点:event.target(IE浏览器中使用:event.srcElement),然后判断源节点的属性与之前设置的是否一致。
后来学习了事件冒泡的机制以后,突然觉得使用阻止冒泡的方法实现该效果思路更加清晰,思路是这样的:在触发该按钮或链接的单击事件的时候显示菜单或浮层,并且组织该事件向上冒泡,并在body的单击事件中隐藏该菜单或者浮层;这样单击该按钮的时候,先显示了浮层,由于阻止按钮的单击事件向上冒泡,所以此时不会触发body的单击事件,而点击按钮之外的其他区域的时候,由于其他区域的单击事件会冒泡的body上而触发body的单击事件,所以会隐藏菜单或者浮层。代码如下:
HTML:
<!DOCTYPE html>
<html> <head> <title>测试</title> <style type="text/css"> *{ font-size: 12px;} ul,li{ padding: 0; margin: 0; list-style: none;} /*按钮的样式*/ .menuBtn{ color: 12px; color: #666;}
/*菜单的样式,默认菜单是隐藏的*/ .menu{ display: none; height: auto; width: 100px; padding: 3px; border: 1px solid #ccc; position: absolute; left: 10px; top: 30px;} .menu li{ height: 20px; line-height: 20px; border-bottom: 1px solid #ccc; text-align: center;} .menu li:last-child{ border: 0;} </style>
<!--使用jQuery--> <script type="text/javascript" src="../resources/scripts/jquery-1.4.2.js"></script> </head> <body> <a id="J_menuBtn" href="javascript:;" class="menuBtn">弹出菜单</a> <ul id="J_menu" class="menu"> <li>菜单项a</li> <li>菜单项b</li> <li>菜单项c</li> <li>菜单项d</li> </ul> </body> </html>
JS:
var btn = $("#J_menuBtn"), menu = $("#J_menu"); $(document.body).click(function () { // 点击body是隐藏菜单 menu.hide(); }); btn.click(function (ev) { // 点击链接(或按钮)是现实菜单 menu.show(); /* 阻止链接(或按钮)的单击事件冒泡 * 在jquery中return false可阻止事件冒泡 * 当然也可以使用其他方法,比如:event.stopPropagation()(IE中使用:event.cancelBubble=true) */ return false; });
效果如下:
点击按钮显示菜单:
点击页面其他区域隐藏菜单:
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束