Я пытаюсь получить элемент внутри тега привязки и установить для него класс CSS, называемый активным, для стилизации конкретного элемента, но я получаю сообщение об ошибке, что элемент не определен. Я не могу понять, в чем проблема.
Я пробовал использовать разные селекторы, такие как featuresLinks.document.querySelectorAll("h3"), но все равно получаю неопределенную ошибку. Я не уверен, какой метод или селектор javascript мне нужно использовать, чтобы получить элемент h3 внутри конкретной ссылки, на которую я нажимаю.
let featuresLinks = document.querySelectorAll(".features-link");
featuresLinks.forEach(featuresLink => {
featuresLink.addEventListener("click", function(e){
e.preventDefault();
active();
})
})
function active(){
let featuresLinkHeading = featuresLinks.firstChild;
if (!featuresLinkHeading.classList.contains("features-active")) {
featuresLinkHeading.classList.add("features-active")
}
};:root {
--primary-blue: hsl(231, 69%, 60%);
--primary-red: hsl(0, 94%, 66%);
--neutral-blue-100: hsl(229, 8%, 60%);
--neutral-blue-900: hsl(229, 31%, 21%);
--neutral-100: hsl(0, 0%, 100%);
--neutral-900: hsl(0, 0%, 0%);
}
.features a {
text-decoration: none;
color: var(--neutral-blue-100);
font-size: 19.5px;
font-weight: 400;
}
body {
font-family: 'Rubik', sans-serif;
font-size: 18px;
margin: 0%;
text-align: center;
}
.features-border::after {
content: "";
display: block;
margin: 0 auto;
width: 52%;
padding-top: .85em;
border-bottom: 4px solid var(--neutral-100);
}
.features-border.features-active::after {
content: "";
display: block;
margin: 0 auto;
width: 52%;
padding-top: .85em;
border-bottom: 4px solid var(--primary-red);
}
a .features-active {
color: var(--neutral-blue-900);
}<body>
<section>
<div class = "content features">
<h2>Features</h2>
<p>Our aim is to make it quick and easy for you to access your favourite websites.
Your bookmarks sync between your devices so you can access them on the go.</p>
<hr>
<a class = "features-link" href = "">
<h3 class = "features-border features-active">Simple Bookmarking</h3>
</a>
<hr>
<a class = "features-link" href = "">
<h3 class = "features-border">Speedy Searching</h3>
</a>
<hr>
<a class = "features-link" href = "">
<h3 class = "features-border">Easy Sharing</h3>
</a>
<hr>
</div>
</section>
</body>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я предлагаю вам делегировать из контейнера
window.addEventListener('DOMContentLoaded', () => { // when page has loaded
const container = document.querySelector('.features');
const featureLinks = container.querySelectorAll('a.features-link');
container.addEventListener("click", function(e) {
const tgt = e.target.closest("a");
if (!tgt || !tgt.matches("a")) return; // we did not click a link or a child of a link
e.preventDefault();
const tgtHeader = tgt.querySelector('h3');
featureLinks.forEach(link => {
const header = link.querySelector('h3');
header.classList.toggle('features-active', header === tgtHeader); // toggle off unless clicked
});
});
});:root {
--primary-blue: hsl(231, 69%, 60%);
--primary-red: hsl(0, 94%, 66%);
--neutral-blue-100: hsl(229, 8%, 60%);
--neutral-blue-900: hsl(229, 31%, 21%);
--neutral-100: hsl(0, 0%, 100%);
--neutral-900: hsl(0, 0%, 0%);
}
.features a {
text-decoration: none;
color: var(--neutral-blue-100);
font-size: 19.5px;
font-weight: 400;
}
body {
font-family: 'Rubik', sans-serif;
font-size: 18px;
margin: 0%;
text-align: center;
}
.features-border::after {
content: "";
display: block;
margin: 0 auto;
width: 52%;
padding-top: .85em;
border-bottom: 4px solid var(--neutral-100);
}
.features-border.features-active::after {
content: "";
display: block;
margin: 0 auto;
width: 52%;
padding-top: .85em;
border-bottom: 4px solid var(--primary-red);
}
a .features-active {
color: var(--neutral-blue-900);
}<section>
<div class = "content features">
<h2>Features</h2>
<p>Our aim is to make it quick and easy for you to access your favourite websites. Your bookmarks sync between your devices so you can access them on the go.</p>
<hr>
<a class = "features-link" href = "">
<h3 class = "features-border features-active">Simple Bookmarking</h3>
</a>
<hr>
<a class = "features-link" href = "">
<h3 class = "features-border">Speedy Searching</h3>
</a>
<hr>
<a class = "features-link" href = "">
<h3 class = "features-border">Easy Sharing</h3>
</a>
<hr>
</div>
</section>Также я хочу, чтобы класс features-active удалялся из двух других тегов h3, когда я нажимаю на один тег h3. Прошу прощения, если мой вопрос был расплывчатым или неясным.
Мы выходим из функции, если цель не была найдена ИЛИ цель была найдена (что-то щелкнуло), но это не было A
См. обновленный ответ
Спасибо, это заняло некоторое время, но я наконец понял.
Я немного смущен тем, что делает
if (!tgt || !tgt.matches("a")) return;.