#javascript #html #arrays #dom-events #dynamic-arrays
Вопрос:
Я пытаюсь создать навигационное меню с включенным эффектом JavaScript, но каждый пункт меню имеет как тег «a», так и «i», и его необходимо включить одновременно. В основном меню html простое;
<div class="menu-nav">
<ul class="menu-nav-list">
<li class="menu-items">
<a href="#" class="menu-nav-link ativo"><i class="uil uil-estate menu-nav-link-icon active-icon"></i> Home</a>
</li>
<li class="menu-items">
<a href="#" class="menu-nav-link"><i class="uil uil-user menu-nav-link-icon"></i> About me</a>
</li>
<li class="menu-items">
<a href="#" class="menu-nav-link"><i class="uil uil-bag menu-nav-link-icon"></i> Works</a>
</li>
<li class="menu-items">
<a href="#" class="menu-nav-link"><i class="uil uil-envelope-minus menu-nav-link-icon"></i> Contact me</a>
</li>
</ul>
</div>
Но в коде JS я пытаюсь манипулировать массивом, в котором есть все элементы, и я могу использовать » это «только для активации определенного элемента в «forEach»
const iconesLink = document.querySelectorAll('.menu-nav-link-icon')
const itemsLink = document.querySelectorAll('.menu-nav-link')
itemsLink.forEach(l => l.addEventListener('click', activeLink, activeIcon))
function activeLink(){
itemsLink.forEach(l => l.classList.remove('ativo'))
this.classList.add('ativo')
}
function activeIcon(){
iconesLink.forEach(i => i.classList.remove('active-icon'))
this.forEach(l => l.classList.add('active-icon'))
}
Был бы другой метод, с помощью которого я мог бы активировать и то, и другое событие одним щелчком мыши?
Комментарии:
1. Что ты пытаешься сделать?
Ответ №1:
eventTarge.addEventListener использует только одну функцию обработчика событий. Функция вызывается с объектом, у которого цель выбрана в качестве цели свойства { target: the element that was clicked }
.
Я получаю щелкнутый элемент в прослушивателе и вызываю две другие функции.
В функции activeIcon мы можем получить ссылку на выбранный значок, вызвав querySelector по нажатому тегу.
<!DOCTYPE html>
<html>
<body>
<div class="menu-nav">
<ul class="menu-nav-list">
<li class="menu-items">
<a href="#" class="menu-nav-link ativo"><i class="uil uil-estate menu-nav-link-icon active-icon"></i> Home</a>
</li>
<li class="menu-items">
<a href="#" class="menu-nav-link"><i class="uil uil-user menu-nav-link-icon"></i> About me</a>
</li>
<li class="menu-items">
<a href="#" class="menu-nav-link"><i class="uil uil-bag menu-nav-link-icon"></i> Works</a>
</li>
<li class="menu-items">
<a href="#" class="menu-nav-link"><i class="uil uil-envelope-minus menu-nav-link-icon"></i> Contact me</a>
</li>
</ul>
</div>
<script>
const iconesLink = document.querySelectorAll('.menu-nav-link-icon')
const itemsLink = document.querySelectorAll('.menu-nav-link')
itemsLink.forEach(l => l.addEventListener('click', function(event) {
activeLink(event.target)
activeIcon(event.target.querySelector('.menu-nav-link-icon'))
}))
function activeLink(current){
itemsLink.forEach(l => l.classList.remove('ativo'));
current.classList.add('ativo')
}
function activeIcon(current){
iconesLink.forEach(i => i.classList.remove('active-icon'));
current.classList.add('active-icon');
}
</script>
</body>
</html>
Комментарии:
1. Пожалуйста, объясните, что вы сделали. Предоставление кода без объяснения причин не очень полезно.