多个事件监听器 - 如何将它们重构为一个函数?

发布于 2025-01-19 19:22:21 字数 2035 浏览 3 评论 0原文

我有一个带有类似子菜单的导航菜单:

<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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文