为什么单击事件监听器只工作一次
Why click event listener just once working
我希望在单击任何 li 元素时执行该函数。我该怎么做?
var listItem = document.getElementById("listItem");
listItem.addEventListener("click", clickTodo)
function clickTodo() {
listItem.style.color = "red"
}
ul li {
cursor: pointer;
}
<ul>
<li id="listItem">One</li>
<li id="listItem">Two</li>
<li id="listItem">Other</li>
</ul>
您不应该有多个具有相同 ID 的元素。您应该改用 class。
然后您可以 select 使用 document.querySelectorAll
的所有元素并为每个元素添加事件侦听器。
document.querySelectorAll('ul > li.listItem').forEach(li =>
li.addEventListener('click', clickTodo));
function clickTodo() {
this.style.color = "red"
}
ul li {
cursor: pointer;
}
<ul>
<li class="listItem">One</li>
<li class="listItem">Two</li>
<li class="listItem">Other</li>
</ul>
listItem
应该是 class
而不是 id
来对所有 li
元素进行分组。然后,使用 forEach
将事件侦听器添加到每个项目,如下所示:
const listItems = document.getElementsByClassName("listItem");
[...listItems].forEach(listItem =>
listItem.addEventListener("click", clickTodo)
);
function clickTodo() {
this.style.color = "red"
}
ul li {
cursor: pointer;
}
<ul>
<li class="listItem">One</li>
<li class="listItem">Two</li>
<li class="listItem">Other</li>
</ul>
ID 必须是唯一的,并且一个元素上的 eventListener 仅对一个元素有效
建议从最近的静态容器委托
增加了好处,您可以添加新的 TODO,并且点击仍然有效
我还建议您使用 CSS 并切换 class
var list = document.getElementById("list");
list.addEventListener("click", clickTodo)
function clickTodo(e) {
const tgt = e.target;
if (tgt.classList.contains("listItem")) tgt.classList.toggle("red");
}
ul li {
cursor: pointer;
}
.red {
color: red;
}
<ul id="list">
<li class="listItem">One</li>
<li class="listItem">Two</li>
<li class="listItem">Other</li>
</ul>
而且 id 应该是唯一的,并且用在单个元素上。
如果你想 select 多个元素,你应该使用 class 代替。
但在那种情况下,您可以直接 select 个元素:
document.querySelectorAll('li').forEach(li =>
li.addEventListener('click', clickTodo));
function clickTodo() {
this.style.color = "red"
}
我希望在单击任何 li 元素时执行该函数。我该怎么做?
var listItem = document.getElementById("listItem");
listItem.addEventListener("click", clickTodo)
function clickTodo() {
listItem.style.color = "red"
}
ul li {
cursor: pointer;
}
<ul>
<li id="listItem">One</li>
<li id="listItem">Two</li>
<li id="listItem">Other</li>
</ul>
您不应该有多个具有相同 ID 的元素。您应该改用 class。
然后您可以 select 使用 document.querySelectorAll
的所有元素并为每个元素添加事件侦听器。
document.querySelectorAll('ul > li.listItem').forEach(li =>
li.addEventListener('click', clickTodo));
function clickTodo() {
this.style.color = "red"
}
ul li {
cursor: pointer;
}
<ul>
<li class="listItem">One</li>
<li class="listItem">Two</li>
<li class="listItem">Other</li>
</ul>
listItem
应该是 class
而不是 id
来对所有 li
元素进行分组。然后,使用 forEach
将事件侦听器添加到每个项目,如下所示:
const listItems = document.getElementsByClassName("listItem");
[...listItems].forEach(listItem =>
listItem.addEventListener("click", clickTodo)
);
function clickTodo() {
this.style.color = "red"
}
ul li {
cursor: pointer;
}
<ul>
<li class="listItem">One</li>
<li class="listItem">Two</li>
<li class="listItem">Other</li>
</ul>
ID 必须是唯一的,并且一个元素上的 eventListener 仅对一个元素有效
建议从最近的静态容器委托
增加了好处,您可以添加新的 TODO,并且点击仍然有效
我还建议您使用 CSS 并切换 class
var list = document.getElementById("list");
list.addEventListener("click", clickTodo)
function clickTodo(e) {
const tgt = e.target;
if (tgt.classList.contains("listItem")) tgt.classList.toggle("red");
}
ul li {
cursor: pointer;
}
.red {
color: red;
}
<ul id="list">
<li class="listItem">One</li>
<li class="listItem">Two</li>
<li class="listItem">Other</li>
</ul>
而且 id 应该是唯一的,并且用在单个元素上。 如果你想 select 多个元素,你应该使用 class 代替。 但在那种情况下,您可以直接 select 个元素:
document.querySelectorAll('li').forEach(li =>
li.addEventListener('click', clickTodo));
function clickTodo() {
this.style.color = "red"
}