我正在尝试从 HTML 列表中删除事件监听器,但无法使其正常工作。下面所示的代码并没有删除监听器。
if(moveChecker===8){
for(var i=0; i<card.length;i++){
card[i].removeEventListener('click', function(e){
cardChecker(e);
}, true);
}
}
else{
for(var i=0; i<card.length;i++){
card[i].addEventListener('click', function(e){
e.preventDefault();
cardChecker(e);
if (moves>2){
if(moves>4){
moveHTML.previousElementSibling.innerHTML = '<p>☆</p>';
}
else {moveHTML.previousElementSibling.innerHTML = '<p>☆ ☆</p>';}
}
}, true);
}
}
我认为这是由于我使用了匿名函数。但是,当我尝试定义它时(例如):
let listener = function(e){
e.preventDefault();
cardChecker(e);
if (moves>2){
if(moves>4){
moveHTML.previousElementSibling.innerHTML = '<p>☆</p>';
}
else {moveHTML.previousElementSibling.innerHTML = '<p>☆ ☆</p>';}
}
}
if(moveChecker===8){
for(var i=0; i<card.length;i++){
card[i].removeEventListener('click', listener(e), true);
}
}
else{
for(var i=0; i<card.length;i++){
card[i].addEventListener('click', listener(e), true);
}
}
然后我不断收到错误消息,指出“e 未定义”。这发生在 addEventListener 行上。
最佳答案
要删除事件监听器,您需要对最初调用 addEventListener
的函数有一个静态引用。使用 removeEventListener('click', function() ...
定义一个全新的新函数(显然尚未添加
)预先处理程序,然后将其作为参数传递给 addEventListener
和 removeEventListener
:
function theListener(e) {
e.preventDefault();
cardChecker(e);
if (moves > 2) {
if (moves > 4) {
moveHTML.previousElementSibling.innerHTML = '<p>☆</p>';
} else {
moveHTML.previousElementSibling.innerHTML = '<p>☆ ☆</p>';
}
}
}
if (moveChecker === 8) {
for (var i = 0; i < card.length; i++) {
card[i].removeEventListener('click', theListener, true);
}
} else {
for (var i = 0; i < card.length; i++) {
card[i].addEventListener('click', theListener, true);
}
}
关于javascript - .removeEventListener 存在问题。我无法将其从 HTML 元素列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49808577/