在 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>
它们不会被删除,因为变量
mouseOverFieldRadio
/mouseOutFieldRadio
是在循环的每次迭代中创建的。