多个事件监听器 - 如何将它们重构为一个函数?
我有一个带有类似子菜单的导航菜单:
<ul>
<li class="sub-menu">
<a class="sub-menu-work" href="#" aria-expanded="false">Work</a>
<ul class="sub-menu-work-items" data-visible="false">
<li>
<a href="/work/example-1">Example 1</a>
</li>
<li>
<a href="/work/example-2">Example 2</a>
</li>
</ul>
</li>
<li class="sub-menu">
<a class="sub-menu-blog" href="#" aria-expanded="false">Blog</a>
<ul class="sub-menu-blog-items" data-visible="false">
<li>
<a href="/work/example-1">Blog Page 1</a>
</li>
<li>
<a href="/work/example-2">Blog Page 2</a>
</li>
</ul>
</li>
现在我可以写一些JS将ARIA扩展的
切换到'true/false',并且数据可见
至这样的“ true/false”:
const subMenuWork = document.querySelector('.sub-menu-work');
const subMenuWorkItems = document.querySelector('.sub-menu-work-items');
const subMenuBlog = document.querySelector('.sub-menu-blog');
const subMenuBlogItems = document.querySelector('.sub-menu-blog-items');
// Toggle work
subMenuWork.addEventListener('click', () => {
subMenuWork.setAttribute('aria-expanded', subMenuWork.getAttribute('aria-expanded') == 'false' ? 'true' : 'false');
subMenuWorkItems.setAttribute('data-visible', subMenuWorkItems.getAttribute('data-visible') == 'false' ? 'true' : 'false');
})
// Toggle blog
subMenuBlog.addEventListener('click', () => {
subMenuBlog.setAttribute('aria-expanded', subMenuBlog.getAttribute('aria-expanded') == 'false' ? 'true' : 'false');
subMenuBlogItems.setAttribute('data-visible', subMenuBlogItems.getAttribute('data-visible') == 'false' ? 'true' : 'false');
})
我的问题是如何创建一个事件侦听器,该侦听器在单击适当的链接时会切换值。
我确实深表歉意,因为我对JS相对较新,尽管我可以使它起作用,但我意识到重构和使其更模块化要好得多。我不知道要搜索什么,所以作为最后的手段来到这里。
提前致谢
I have a navigation menu with sub menus like so:
<ul>
<li class="sub-menu">
<a class="sub-menu-work" href="#" aria-expanded="false">Work</a>
<ul class="sub-menu-work-items" data-visible="false">
<li>
<a href="/work/example-1">Example 1</a>
</li>
<li>
<a href="/work/example-2">Example 2</a>
</li>
</ul>
</li>
<li class="sub-menu">
<a class="sub-menu-blog" href="#" aria-expanded="false">Blog</a>
<ul class="sub-menu-blog-items" data-visible="false">
<li>
<a href="/work/example-1">Blog Page 1</a>
</li>
<li>
<a href="/work/example-2">Blog Page 2</a>
</li>
</ul>
</li>
Now I can write a bit of JS to toggle the aria-expanded
to 'true/false' and the data visible
to 'true/false' like so:
const subMenuWork = document.querySelector('.sub-menu-work');
const subMenuWorkItems = document.querySelector('.sub-menu-work-items');
const subMenuBlog = document.querySelector('.sub-menu-blog');
const subMenuBlogItems = document.querySelector('.sub-menu-blog-items');
// Toggle work
subMenuWork.addEventListener('click', () => {
subMenuWork.setAttribute('aria-expanded', subMenuWork.getAttribute('aria-expanded') == 'false' ? 'true' : 'false');
subMenuWorkItems.setAttribute('data-visible', subMenuWorkItems.getAttribute('data-visible') == 'false' ? 'true' : 'false');
})
// Toggle blog
subMenuBlog.addEventListener('click', () => {
subMenuBlog.setAttribute('aria-expanded', subMenuBlog.getAttribute('aria-expanded') == 'false' ? 'true' : 'false');
subMenuBlogItems.setAttribute('data-visible', subMenuBlogItems.getAttribute('data-visible') == 'false' ? 'true' : 'false');
})
My question is how can I create just one event listener that will toggle the values when the appropriate link is clicked on.
I do apologise as I'm relatively new to JS and, although I can get this to work, I realise that it is much much better to refactor and make it more modular. I had no idea what to search for so came here as a last resort.
Thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论