Непосредственная проблема, с которой вы столкнулись, заключается в том, что это только запрос, а затем добавление прослушивателя событий к одному элементу.
const smallBox = document.querySelector('.smallBox');
smallBox.addEventListener('mouseover', () => {
smallBox.classList.add('permahover');
});
В приведенной выше части кода: querySelector возвращает только первый соответствующий элемент. Возможно, вы ищете querySelectorAll , который возвращает NodeList соответствующих элементов.
У вас есть два варианта (возможно, другие, если вы хотите реструктурировать свой код дальше). Наивный подход заключается в том, чтобы фактически запрашивать все ячейки и добавлять прослушиватели событий в каждую из них.
var n=16; //take grid column value as you want
const bigContainer = document.querySelector('.bigContainer')
for(var i = 1; i < n; i++) {
bigContainer.innerHTML+='<div class="row">';
for(j = 0; j < n; j++) {
bigContainer.innerHTML+='<div class="smallBox">';
}
}
const smallBoxes = document.querySelectorAll('.smallBox');
[...smallBoxes].forEach(smallBox => {
smallBox.addEventListener('mouseover', () => {
smallBox.classList.add('permahover');
});
})
.smallBox {
border: 1px solid black;
width: 20px;
height: 20px;
display: inline-block;
}
.permahover {
background: red;
}
h1 {
text-align: center;
}
.bigContainer {
text-align: center;
}
<h1>Etch-a-Sketch Assignment - The Odin Project</h1>
<div class="bigContainer">
</div>
Другой вариант - использовать делегирование события , как вы определили. Вот как вы можете использовать это. Примечание: этот подход немного сложнее для агрессивного события, такого как «наведение мыши», поскольку вы можете получить ложноположительные цели (например, внешний контейнер).
var n=16; //take grid column value as you want
const bigContainer = document.querySelector('.bigContainer')
for(var i = 1; i < n; i++) {
bigContainer.innerHTML+='<div class="row">';
for(j = 0; j < n; j++) {
bigContainer.innerHTML+='<div class="smallBox">';
}
}
bigContainer.addEventListener('mouseover', e => {
var target = e.target
if (target !== bigContainer) {
target.classList.add('permahover')
}
})
.smallBox {
border: 1px solid black;
width: 20px;
height: 20px;
display: inline-block;
}
.permahover {
background: red;
}
h1 {
text-align: center;
}
.bigContainer {
text-align: center;
}
<h1>Etch-a-Sketch Assignment - The Odin Project</h1>
<div class="bigContainer">
</div>