JavaScript for 循环中的事件绑定导致重复执行问题

以下代码展示了在 JavaScript for 循环中使用 label.onclick 绑定事件处理函数导致 console.log(1) 语句被重复执行两次的问题:

for (const key in config) {
    console.log(config[key]);
    let label = document.createElement('label')
    let input = document.createElement('input')
    let span = document.createElement('span')
    input.type = 'checkbox'
    input.checked = config[key].option
    span.innerText = config[key].name
    label.appendChild(input)
    label.appendChild(span)
    boss.appendChild(label)
    boss.style.bottom = '26px'
    label.onclick = function () {
      config[key].option = input.checked
      // console.log(config[key]);
      console.log(1);
    }

  }

问题原因:

在 for 循环中,每次循环都会创建一个新的 label 元素,并使用 label.onclick 为其绑定一个新的匿名函数。因此,当点击任何一个 label 元素时,都会执行所有 label 元素上绑定的匿名函数,导致 console.log(1) 被重复执行两次。

解决方案:

为了避免重复执行,可以使用 addEventListener 方法将事件处理函数绑定到 label 元素上。这样可以确保只有一个事件处理函数被绑定到 label 元素上。

for (const key in config) {
    console.log(config[key]);
    let label = document.createElement('label')
    let input = document.createElement('input')
    let span = document.createElement('span')
    input.type = 'checkbox'
    input.checked = config[key].option
    span.innerText = config[key].name
    label.appendChild(input)
    label.appendChild(span)
    boss.appendChild(label)
    boss.style.bottom = '26px'
    label.addEventListener('click', function () {
      config[key].option = input.checked
      // console.log(config[key]);
      console.log(1);
    });

  }

通过使用 addEventListener 方法,我们确保每个 label 元素只绑定了一个事件处理函数,从而避免了重复执行的问题。

JavaScript for 循环中的事件绑定导致重复执行问题

原文地址: https://www.cveoy.top/t/topic/mkHV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录