jQuery实现点击弹窗外部关闭、按钮切换显隐的优化写法
问题修复方案
原有代码有两个核心问题:
- 每次点击
.tool都会重复给document绑定点击事件,点得越多绑定的事件越多,最后逻辑会乱,还会占额外内存 - 靠挨个列className判断点击位置的写法太死板,弹窗里加个新元素就得改判断条件,维护起来太麻烦
实现代码
逻辑说明
- 判断点击外部不用枚举元素类名,用jQuery的
closest()方法就行:这个方法会顺着DOM树往上找匹配的祖先,只要点击的目标在.tool(触发按钮)或者.delet_wrap(弹窗)内部,就不触发关闭;找不到就说明点在了外面,直接关弹窗 - 点
.tool的时候要阻止事件冒泡,不然点按钮的事件会冒到document上,弹窗刚打开就会被关掉 - 直接用
toggle()就能实现重复点击按钮切换弹窗开关的效果,不用自己手动判断display状态 - document的点击事件全局只绑一次,不要套在按钮的点击回调里
修正后的JS代码
// 全局绑定一次外部点击关闭逻辑 $(document).on("click", function (e) { // 点击位置不在按钮和弹窗范围内就关闭 if (!$(e.target).closest(".tool, .delet_wrap").length) { $(".delet_wrap").hide(); } }); // 工具按钮点击逻辑 $(".tool").on("click", function (e) { e.stopPropagation(); // 阻止事件冒泡到document $(".delet_wrap").toggle(); // 切换弹窗显示/隐藏 }); // 可选:点弹窗里的确认/取消按钮后关弹窗,业务逻辑直接加在这 $(".consider, .confirm").on("click", function () { $(".delet_wrap").hide(); // 对应按钮的业务逻辑写在这里 });
原有的HTML和CSS不用改,替换掉原来的JS代码就能正常运行。
方案优势
- 完全不用关心弹窗内部有多少元素、类名是什么,后续弹窗结构怎么改都不用动判断逻辑
- 事件只绑定一次,不会出现重复绑定导致的各种奇怪bug
- 代码简洁,逻辑清晰,后续改起来方便
内容的提问来源于stack exchange,提问作者AWEI
相关产品推荐
相关产品推荐

