javascript - 点击一定次数后禁用事件监听器

标签 javascript event-listener

如何在收到一定数量的点击后禁用事件监听器?

我认为下面的代码是错误的,因为我要求从事件监听器中禁用事件监听器。

let cells = document.querySelectorAll('.cell');

let temp = 0;
function clicker (x) {
  temp += 1;
  console.log('clicked',x.target.classList[1],temp);
  x.target.style.backgroundColor = 'red';
  if (temp === 3) {
    cells.forEach(c => c.removeEventListener('click', (el) => clicker(el)));
  }
  return;
}

cells.forEach(c => c.addEventListener('click', (el) => clicker(el)));
.main {
  display: grid;
  grid-template-columns: repeat(3,90px);
  grid-template-rows: repeat(2, 90px);
  row-gap: 5px;
  column-gap: 5px;
}

.cell {
  width: 90px;
  height: 90px;
  background-color: blue;
}
<div class="main">
  <div class = "cell fir"></div>
  <div class = "cell sec"></div>
  <div class = "cell thi"></div>
  <div class = "cell fou"></div>
  <div class = "cell fif"></div>
  <div class = "cell six"></div>
</div>

最佳答案

传递给removeEventListener的函数必须与传递给addEventListener的函数相同。由于您在每个地方都使用匿名函数,因此它们不会是相同的函数。

只需使用函数的名称,而不是调用它的匿名函数。

let cells = document.querySelectorAll('.cell');

let temp = 0;
function clicker (x) {
  temp += 1;
  console.log('clicked', temp);
  if (temp === 3) {
    cells.forEach(c => c.removeEventListener('click', clicker));
  }
  return;
}

cells.forEach(c => c.addEventListener('click', clicker));
.main {
  display: grid;
  grid-template-columns: repeat(3,90px);
  grid-template-rows: repeat(2, 90px);
  row-gap: 5px;
  column-gap: 5px;
}

.cell {
  width: 90px;
  height: 90px;
  background-color: blue;
}
<div class="main">
  <div class = "cell fir"></div>
  <div class = "cell sec"></div>
  <div class = "cell thi"></div>
  <div class = "cell fou"></div>
  <div class = "cell fif"></div>
  <div class = "cell six"></div>
</div>

关于javascript - 点击一定次数后禁用事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62326050/

相关文章:

javascript - 实时音频网络到桌面应用程序

javascript - 如何从 .env 文件安全地检索 API key 到 javascript View - Laravel

javascript - 为什么针对工厂的 Angular 数据绑定(bind)只能与函数一起使用?

javascript - Promise 中的递归重试

javascript - 谷歌地图 API v3,点击事件未在 Java 脚本中触发

java - 仅当主监听器更新时,如何将主事件监听器中的 MesageReceivedEvent 与线程内的新变量同步

javascript - 在 Angular 8 中单击时在 NgOninit 中触发事件

JavaScript猜词游戏问题: the same letter won't populate multiple times once the letter key is pressed

NHibernate 保存/更新事件监听器 : listening for child object saves

javascript - 如何在 Chrome 开发者工具中查看页面的所有事件?