RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1227498
Accepted
Михаил Камахин
Михаил Камахин
Asked:2022-01-05 22:47:02 +0000 UTC2022-01-05 22:47:02 +0000 UTC 2022-01-05 22:47:02 +0000 UTC

事件侦听器不会在循环中删除

  • 772

在 Quiz 类中,我有一个创建 DOM 元素的 createFieldsRadio 函数。
我正在挂起单击事件,将鼠标指向/移动到那里。
第一次点击

if (clickCounter === 1) {
  fieldRadio.classList.add('active');
  arrFields.forEach(item => {
    item.removeEventListener('mouseover', mouseOverFieldRadio);
    item.removeEventListener('mouseout', mouseOutFieldRadio);
  });
}

然后我尝试遍历页面上的 DOM 元素数组并删除它们的事件侦听器。
但由于某种原因,它们没有被删除。

class Quiz {
  constructor(options) {
    this.formDOM = document.querySelector(`#${options.nameForm}`);
    const radioS = Array.from(this.formDOM.querySelectorAll(`[name=${options.nameInputRadio}]`));
    this.radioS = this.cloneRadios(radioS);
    this.deleteRadios(radioS);
    this.fieldsRadio = this.createFieldsRadio(this.formDOM, this.radioS);
  }

  cloneRadios(radiosDom) {
    return radiosDom.map(item => {
      const newItem = item.cloneNode(true);
      return item.cloneNode(true);
    })
  }

  deleteRadios(radiosDom) {
    for (let i = radiosDom.length - 1; i > -1; i--) {
      radiosDom[i].remove();
      radiosDom.splice(i, 1);
    }
  }

  createFieldsRadio(formDOM, radiosDom) {
    const arrFields = [];
    let clickCounter = 0;

    for (let i = 0; i < radiosDom.length; i++) {
      const fieldRadio = document.createElement('div');

      const mouseOverFieldRadio = (e) => {
        fieldRadio.classList.add('hover');
      }
  
      const mouseOutFieldRadio = (e) => {
        fieldRadio.classList.remove('hover');
      }

      fieldRadio.classList.add('fieldRadio');
      fieldRadio.innerHTML = `
        <div class="fieldRadio__text">${radiosDom[i].value}</div>
        <div class="fieldRadio__voting"></div>
      `;
      fieldRadio.addEventListener('click', (e) => {
        clickCounter++;
        if (clickCounter === 1) {
          fieldRadio.classList.add('active');
          arrFields.forEach(item => {
            item.removeEventListener('mouseover', mouseOverFieldRadio);
            item.removeEventListener('mouseout', mouseOutFieldRadio);
          });
        }
      });

      fieldRadio.addEventListener('mouseover', mouseOverFieldRadio);
      fieldRadio.addEventListener('mouseout', mouseOutFieldRadio);
      arrFields.push(fieldRadio);
      formDOM.append(fieldRadio);
    }
    return arrFields.slice();
  }

  getStatistics() { // тут получение данных из бд
    return {
      "Интроверт": 3,
      "Экстраверт": 4,
      "Не знаю": 2
    };
  }
}

const newQuiz = new Quiz({
  nameForm: 'whoAreYouForm',
  nameInputRadio: 'whoAreYou'
});
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap');

*, *::before, *::after {
  box-sizing: border-box;
  /* margin: 0;
  padding: 0; */
}

body {
  font-family: 'Roboto', sans-serif;
  margin: 0;
}

img {
  display: block;
  max-width: 100%;
}

h2 {
  font-weight: normal;
}

p {
  line-height: 1.6;
}

main {
  padding: 40px 0;
}

.container {
  display: block;
  width: 100%;
  padding: 0 10px;
  max-width: 1000px;
  margin: 0 auto;
}

.code {
  color: #242729;
  background-color: #e4e6e8;
  padding: 2px 4px;
  border-radius: 3px;
}

.form {
  padding: 15px;
  box-shadow: inset 0 0 0 1px #dce1e6;
  border-radius: 8px;
  max-width: 300px;
}

.form > * + * {
  margin-top: 10px;
}

.form__header {
  line-height: normal;
  margin: 0 0 15px 0;
}

.fieldRadio {
  background-color: #e5ebf1;
  padding: 6px 75px 8px 10px;
  font-size: 13px;
  border-radius: 4px;
  cursor: pointer;
  position: relative;
  transition: background-color 0.15s linear;
}

.fieldRadio.active {
  background-color: #c5d0db !important;
}

.fieldRadio__text {

}

.fieldRadio__voting {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  width: 100%;
  height: 100%;
  /* background-color: red; */
}

.fieldRadio.hover {
  background-color: #d3d9de;
}
<form class="form" id="whoAreYouForm">
  <p class="form__header">Кто ты?</p>
  <input name="whoAreYou" type="radio" value="Интроверт">
  <input name="whoAreYou" type="radio" value="Экстраверт">
  <input name="whoAreYou" type="radio" value="Не знаю">
</form>

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    user176262
    2022-01-05T22:53:27Z2022-01-05T22:53:27Z

    它们不会被删除,因为变量mouseOverFieldRadio/mouseOutFieldRadio是在循环的每次迭代中创建的。

    • 2

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5