javascript - 无法将 eventListener 添加到通过 JavaScript 创建的 div
问题描述
我正在做一个 Etch-A-Scetch 项目。我创建了一个网格,其中包含一定数量的相同大小的正方形(用户可以输入应该显示的正方形数量)。为了创建正方形,我使用了 CSS 网格和 Javascript for 循环。现在我想添加事件侦听器,在移动每个 Square 时更改其背景。不幸的是,当我尝试添加一些时,它总是显示错误。当前代码没有显示错误,它只是不做任何事情。
方法 createSquares() 应该只创建正方形的数量并将其添加到 DOM。用户输入一个数量,例如10个,显示的方块是x方向10个,y方向10个-->总共100个方块。之后,我想添加一个事件监听器,它会改变用户悬停在方块上的背景颜色(背景颜色应该保持不变)。我很感谢任何帮助,因为我真的一无所知:D
let squareDiv = document.querySelector('.squareDiv');
let squares = document.getElementById('#squares')
let squareAmount = 10;
function blackColor() {
this.style.backgroundColor = '#000';
this.style.border = '0px';
}
function createSquares() {
for (i = 0; i < squareAmount * squareAmount; i++) {
squares = document.createElement('div');
squares.setAttribute("id", "squares");
// squares.setAttribute("onmouseover", "addEventListener")
squares.style.display = 'grid';
squareDiv.style.setProperty('--columns-amount', squareAmount);
squareDiv.style.setProperty('--rows-amount', squareAmount);
squareDiv.appendChild(squares);
}
}
createSquares();
if (squares) {
squares.addEventListener('mouseover', _ => {
squares.style.backgroundColor = blackColor;
});
}
<div class="squareDiv"></div>
<div id="squares"></div>
解决方案
你可能需要这样的东西
我修复了脚本,现在修复 CSS
let container = document.getElementById("container")
let squareAmount = 5;
function getRandom() {
return '#'+Math.floor(Math.random()*16777215).toString(16);
}
function colorIt(sq) {
sq.style.backgroundColor = document.getElementById("random").checked? getRandom() : '#000';
sq.style.border = '0px';
}
function createSquares() {
let grid = document.createElement('div');
grid.setAttribute("id","squares")
grid.classList.add("grid");
for (i = 0; i < squareAmount * squareAmount; i++) {
square = document.createElement('div');
square.classList.add("square");
grid.appendChild(square);
}
container.innerHTML="";
container.appendChild(grid)
}
createSquares();
container.addEventListener('mouseover',
e => {
const target = e.target;
if (target.matches(".square")) colorIt(target)
}
);
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
grid-auto-rows: 1fr;
}
.grid::before {
content: '';
width: 0;
padding-bottom: 100%;
grid-row: 1 / 1;
grid-column: 1 / 1;
}
.grid > *:first-child {
grid-row: 1 / 1;
grid-column: 1 / 1;
}
/* Just to make the grid visible */
.grid > * {
background: rgba(0,0,0,0.1);
border: 1px white solid;
}
<label><input type="checkbox" id="random" />Random</label>
<div id="container"></div>
推荐阅读
- mysql - 存储过程中的临时表返回的值与常规查询不同
- reactjs - 我重复使用了我的 React Element 两次,第二次没有响应点击
- c - 初学者需要简单解释评估顺序和优先级/关联性之间的区别
- windows - 在 powershell 脚本中使用 cmd 命令?
- javascript - 覆盖 R Shiny 模态对话框中的关闭按钮
- python - 为什么 scipy.optimize 没有给我正确的答案?
- android - 不显示某些视图的 viewPager 指示器
- c# - 将外部文本文件导入 Xamarin Forms 应用程序
- laravel - 如何在 VueJS 的 SetTimeOut 中提交存储
- c# - 如何在 Unity 中保留对粒子系统模块结构的引用