使用 closest() 函数获取正确的 DOM 元素
栏目: JavaScript · 发布时间: 5年前
内容简介:最近我在使用垂直导航组件的时候遇到了一个问题:点击菜单项的时候,对应的 JavaScript 代码并没有触发。我对这个问题进行了比较深入的了解之后,分享下解决这个问题的过程以及在这过程中发现的技巧。这个问题的场景是这样的,所有的菜单项都有两个子元素:一个图标,以及一个作为标签的在
最近我在使用垂直导航组件的时候遇到了一个问题:点击菜单项的时候,对应的 JavaScript 代码并没有触发。我对这个问题进行了比较深入的了解之后,分享下解决这个问题的过程以及在这过程中发现的技巧。
这个问题的场景是这样的,所有的菜单项都有两个子元素:一个图标,以及一个作为标签的 <span>
元素,这两个元素均嵌入到了链接中。
<li> <a href="#example" class="toggle"> <img src="/img/billing.svg" width="20" height="20" alt=""> <span>Billing</span> </a> <div id="example"> <ul> <li><a href="/statment/">My Statement</a></li> <li><a href="/history/">Pay History</a></li> </ul> </div> </li> 复制代码
在 <div>
元素中还有二级菜单,我添加了一些 JavaScript 来控制二级菜单的开启/关闭状态。
document.addEventListener('click', function (event) { // 保证点击的元素是可以切换开关状态的 if (!event.target.classList.contains('toggle')) { return; } event.preventDefault(); // 获取元素内容 var content = document.querySelector(event.target.hash); if (!content) { return; } // 切换内容的开启/关闭状态 toggle(content); }, false); 复制代码
toggle
方法会触发一个函数,这个函数会检查二级菜单是否有 .is-visible
CSS 类。如果元素具有这个类,那么二级菜单将会被隐藏,否则会显示二级菜单:
var toggle = function (elem, timing) { // 如果二级菜单是可见的,那么就隐藏它 if (elem.classList.contains('is-visible')) { hide(elem); return; } // 否则,展示二级菜单 show(elem); }; 复制代码
我希望点击菜单项中的任何位置,都会触发 JavaScript 并且执行切换操作。但是如果我点击图标或者标签子元素,JavaScript 就不会执行。原因是 event.target 返回到的是实际点击到的 DOM 元素。点击图标或者标签只会返回图标或者标签元素。
closest()
方法
我需要获取到触发了点击事件的目标,并且返回其父元素,而不是子元素。我采用了使用 closest()
方法的解决方案。这个方法会从当前元素开始,遍历 DOM 树,并且返回和给定参数匹配的最近的祖先:
let closestElement = Element.closest(selector); 复制代码
这段代码让我醍醐灌顶。我可以通过 closest()
和 event.target
来找到并且返回父元素(菜单项链接),无论我点击的是哪个子元素(图标或者标签):
if (!event.target.closest('a').classList.contains('toggle')) { return; } var content = document.querySelector(event.target.closest('a').hash); 复制代码
现在,点击菜单项的任何地方都会触发 JavaScript 并且切换二级菜单了。
希望这个小窍门可以帮助你定位特定的 DOM 元素。 closest()
方法在大多数主流浏览器上都是支持的,但是在 IE11 上需要引入 polyfill。
如果你需要更加深入的了解本文相关的内容,我推荐 Zell Liew 的关于遍历 DOM 元素的文章 。他介绍了本文使用的这种方法以及其他一些值得一试的技巧。
如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为掘金 上的英文分享文章。内容覆盖 Android 、 iOS 、 前端 、 后端 、 区块链 、 产品 、 设计 、 人工智能 等领域,想要查看更多优质译文请持续关注 掘金翻译计划 、官方微博、 知乎专栏 。
以上所述就是小编给大家介绍的《使用 closest() 函数获取正确的 DOM 元素》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- [译] 使用 closest() 函数获取正确的 DOM 元素
- 安全测试辅助之如何快速找出元素绑定的事件函数代码
- Go 语言函数式编程系列教程(十) —— 数据类型篇:在数组切片中动态增删元素
- CSS 基础:块级元素、行内元素、替换元素、非替换元素
- CSS 技巧篇(六):display设置元素为行内元素时,元素之间存在间隙问题
- 探究行内元素和块级元素
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人人都是架构师:分布式系统架构落地与瓶颈突破
高翔龙 / 电子工业出版社 / 2017-5 / 69
《人人都是架构师:分布式系统架构落地与瓶颈突破》并没有过多渲染系统架构的理论知识,而是切切实实站在开发一线角度,为各位读者诠释了大型网站在架构演变过程中出现一系列技术难题时的解决方案。《人人都是架构师:分布式系统架构落地与瓶颈突破》首先从分布式服务案例开始介绍,重点为大家讲解了大规模服务化场景下企业应该如何实施服务治理;然后在大流量限流/消峰案例中,笔者为大家讲解了应该如何有效地对流量实施管制,避......一起来看看 《人人都是架构师:分布式系统架构落地与瓶颈突破》 这本书的介绍吧!