【发布时间】:2020-06-04 22:41:18
【问题描述】:
我在 HTML 集合中有 3 个元素,并使用 forEach 循环将 onclick 侦听器附加到它们
[].forEach.call(signBoxes, (e, i) => {
e.addEventListener("click", callSetSign = () => setSign(signs[i]));
});
function setSign({ name, src }) {
const sign = name;
const Img = src;
player1Choice.src = Img;
[].forEach.call(signBoxes, (e, i) => {
e.removeEventListener("click", callSetSign);
});
socket.emit("self-choose-sign", sign);
}
添加侦听器可以正常工作,但是当我尝试以相同方式删除它们时,只会删除最后一个元素的侦听器。如果我像这样更改函数,我会得到相同的结果。
function setSign({ name, src }) {
const sign = name;
const Img = src;
player1Choice.src = Img;
signBoxes[0].removeEventListener('click', callSetSign)
signBoxes[1].removeEventListener('click', callSetSign)
signBoxes[2].removeEventListener('click', callSetSign) // only this one works
socket.emit("self-choose-sign", sign);
}
谁能解释一下?
【问题讨论】:
-
callSetSign = () => setSign(signs[i])callSetSign 的值。它只会指向分配给它的最后一个箭头函数。这也只会在最后一个迭代的元素上。这可以解释您报告的行为 -
感谢快速回答,但如果我在循环之前声明 callSetSign,是否可以在不使用绑定的情况下传递参数,以便稍后删除监听器?
-
function callSetSign () { return setSign(this); }与e.addEventListener("click", callSetSign);配对我想会让你做你想做的事
标签: javascript events removeeventlistener