gpt4 book ai didi

javascript - 如何在按钮点击时切换元素并在外部点击时关闭?

转载 作者:行者123 更新时间:2023-11-27 23:38:05 25 4
gpt4 key购买 nike

我想在单击相关按钮时切换某些元素的可见性。此外,我希望在可见元素之外的任何地方发生点击时关闭可见元素。可见元素内的任何链接也应该能够被点击。这是针对 Shopify 主题的,不确定这是否有所作为。

我也试过在元素上使用 focusout 事件监听器,但有同样的问题。

Javascript

const selectors = {
mobileDownBtns: document.querySelectorAll('.mobile-nav__down-btn'),
mainDownBtns: document.querySelectorAll('.main-nav-list__down-btn'),
mainParent: document.querySelectorAll('.main-nav-parent-item'),
spotifyBtn: document.querySelector('#spotifyBtn')
}

selectors.spotifyBtn.addEventListener('click', toggleElement);

selectors.mainDownBtns.forEach(function(btn) {
btn.addEventListener('click', toggleElement);
});

function toggleElement(event) {
const btn = event.currentTarget;
const elem = btn.nextElementSibling;
const container = btn.parentElement;

if (elem.classList.contains('show')) {
btn.setAttribute('aria-expanded', 'false');
elem.classList.remove('show');
container.classList.remove('isActive');
} else {
btn.setAttribute('aria-expanded', 'true');
elem.classList.add('show');
container.classList.add('isActive');
}
}

window.addEventListener('mousedown', function(e) {
const container = document.querySelector('.isActive');
const btn = container.querySelector('button');
const child = container.querySelector('.show');

if (e.target != container && e.target.parentNode !== container) {
container.classList.remove('isActive');
btn.setAttribute('aria-expanded', 'false');
child.classList.remove('show');
}
});

HTML

<ul class="site-header__icon-list small--hide">
<li class="site-header__icon-list--item">
<button aria-label="Check out my spotify playlist" aria-expanded="false" id="spotifyBtn">
{% include 'alt-icon-music' %}
</button>

<div class="site-header__spotify">
{% include 'spotify' %}
</div>
</li>
</ul>

<nav role="navigation" class="site-header__main-nav--wrapper small--hide">
<ul class="main-nav-list">
{% for link in linklists[section.settings.menu].links %}
{% if link.links != blank %}
<li class="main-nav-list__item">
<div class="main-nav-parent-item">
<button class="main-nav-list__down-btn site-header__icon" aria-controls="navigation" aria-label="See sub navigation" aria-expanded="false">
<span>
{{ link.title }}
</span>

{% include 'alt-icon-chevron-down' %}
</button>

<div class="main-nav-list__dropdown">
<ul class="main-nav-list__child-list{% if link.links.size > 7 %} long{% endif %}">
{% for childlink in link.links %}
<li class="main-nav-list__item child-item">
<a href="{{ childlink.url }}">
{{ childlink.title }}
</a>
</li>
{% endfor %}
</ul>
</div>
</div>
</li>
{% else %}
<li class="main-nav-list__item">
<a href="{{ link.url }}">
{{ link.title }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
</nav>

我的切换功能本身运行良好,但是当我添加窗口事件监听器时,切换功能不再像我希望的那样工作。第一次单击按钮有效(显示元素)并且窗口监听器有效(隐藏可见元素),但是按钮上的任何其他单击都不起作用。此外,尽管窗口监听器用于关闭可见元素,但它不允许在关闭之前在可见元素内部单击。

控制台也报错

"Uncaught TypeError: Cannot read property 'querySelector' of null"

但是当我使用 console.log 时,正确的变量被记录到控制台。

这几天我一直在研究这个问题。我对 javascript 还是很陌生,我不确定这里出了什么问题。在此先感谢您的帮助。

最佳答案

document.getElementById('#spotifyBtn')

使用“document.getElementById”代替“document.querySelector”

关于javascript - 如何在按钮点击时切换元素并在外部点击时关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57156647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com