如何让事件侦听器一次只在一个项目上添加 CSS 元素(香草 JavaScript)
How to make the event listener only add CSS element on one item at a time (vanilla JavaScript)
^我希望一次只能启用一个样式。
^我可以做到这一点,但我不希望用户能够做到。
因此,很难提出一个可能很简单的解决方案的问题。我基本上有一个构建版本列表,我希望用户在其中 select 一个。当其中一个版本被 selected 时,它会向项目添加边框以显示其已被单击。但是,现在使用我的代码,用户可以 select 所有 3 个项目并启用它们的 CSS 元素。我希望用户只能“激活”列表中的一项。
HTML 和 CSS:
<ul class="listContents">
<li><p><a href="#" class="links">Stable</a></p></li>
<li><p><a href="#" class="links">Preview</a></p></li>
<li><p><a href="#" class="links">LTS</a></p></li>
</ul>
<style>
.colorText {
background-color: #58a7ed;
color: white;
}
</style>
和 JS 的东西:
const btn = document.querySelectorAll('.links');
for (let i = 0; i < btn.length; i++ ) {
btn[i].addEventListener("click", function() {
btn[i].classList.add('colorText')
})
}
我真的希望我说清楚了,我觉得我的英语不及格,试图用正确的措辞来表达这个意思哈哈。
就在您将 colorText class 添加到所需项目之前,我们可以从所有项目中删除 colorText,确保一次只有 1 个获得 class.
// the rest is the same...
btn[i].addEventListener("click", function() {
// remove it from all:
btn.forEach(function(item) {
item.classList.remove('colorText');
});
// add it back to the desired one
btn[i].classList.add('colorText')
})
您还可以使用 forEach
循环,使用 event.target
访问点击的 link
const btns = document.querySelectorAll('.links');
btns.forEach(btn => {
btn.addEventListener('click', e => {
// remove any existing active links
btns.forEach(b => b.classList.remove('colorText'));
// activate the clicked link
e.target.classList.add('colorText');
})
});
.colorText {
background-color: #58a7ed;
color: white;
}
<ul class="listContents">
<li>
<p><a href="#" class="links">Stable</a></p>
</li>
<li>
<p><a href="#" class="links">Preview</a></p>
</li>
<li>
<p><a href="#" class="links">LTS</a></p>
</li>
</ul>
你也可以使用简单的 for of
const btn = document.querySelectorAll(".links");
for (let bt of btn) {
bt.addEventListener("click", (e) => {
btn.forEach((b) => b.classList.remove("colorText"));
e.target.classList.add("colorText");
});
}
^我希望一次只能启用一个样式。
^我可以做到这一点,但我不希望用户能够做到。
因此,很难提出一个可能很简单的解决方案的问题。我基本上有一个构建版本列表,我希望用户在其中 select 一个。当其中一个版本被 selected 时,它会向项目添加边框以显示其已被单击。但是,现在使用我的代码,用户可以 select 所有 3 个项目并启用它们的 CSS 元素。我希望用户只能“激活”列表中的一项。
HTML 和 CSS:
<ul class="listContents">
<li><p><a href="#" class="links">Stable</a></p></li>
<li><p><a href="#" class="links">Preview</a></p></li>
<li><p><a href="#" class="links">LTS</a></p></li>
</ul>
<style>
.colorText {
background-color: #58a7ed;
color: white;
}
</style>
和 JS 的东西:
const btn = document.querySelectorAll('.links');
for (let i = 0; i < btn.length; i++ ) {
btn[i].addEventListener("click", function() {
btn[i].classList.add('colorText')
})
}
我真的希望我说清楚了,我觉得我的英语不及格,试图用正确的措辞来表达这个意思哈哈。
就在您将 colorText class 添加到所需项目之前,我们可以从所有项目中删除 colorText,确保一次只有 1 个获得 class.
// the rest is the same...
btn[i].addEventListener("click", function() {
// remove it from all:
btn.forEach(function(item) {
item.classList.remove('colorText');
});
// add it back to the desired one
btn[i].classList.add('colorText')
})
您还可以使用 forEach
循环,使用 event.target
const btns = document.querySelectorAll('.links');
btns.forEach(btn => {
btn.addEventListener('click', e => {
// remove any existing active links
btns.forEach(b => b.classList.remove('colorText'));
// activate the clicked link
e.target.classList.add('colorText');
})
});
.colorText {
background-color: #58a7ed;
color: white;
}
<ul class="listContents">
<li>
<p><a href="#" class="links">Stable</a></p>
</li>
<li>
<p><a href="#" class="links">Preview</a></p>
</li>
<li>
<p><a href="#" class="links">LTS</a></p>
</li>
</ul>
你也可以使用简单的 for of
const btn = document.querySelectorAll(".links");
for (let bt of btn) {
bt.addEventListener("click", (e) => {
btn.forEach((b) => b.classList.remove("colorText"));
e.target.classList.add("colorText");
});
}