javascript - how to make my for loop continue after using a reset
问题描述
I just need some guidance. I feel a bit lost with why my for loop stopped. it's a simple etch-a-sketch game, the for loop before the reset responds but after creating new grids, it doesn't load anymore. My knowledge is lacking on what I can do next. I would love some guidance, if you do fix the code please offer me an explanation or some resource that I can refer so I can understand myself.
Here is my code:
//first div
let container = document.createElement('div')
container.setAttribute('id', 'container');
container.classList.add("grid");
document.body.appendChild(container);
//second div
let containerGrid = document.createElement('div')
containerGrid.setAttribute('id', 'containerGrid');
containerGrid.classList.add("grids");
document.body.appendChild(containerGrid);
//button div
let buttonDiv = document.createElement('div')
buttonDiv.setAttribute('id', 'button');
buttonDiv.classList.add("button");
document.body.appendChild(buttonDiv);
//buttons
const startAgain = document.createElement('button');
startAgain.setAttribute('id', 'createbtn');
startAgain.style.padding = "10px";
startAgain.textContent ="New grid"
container.appendChild(startAgain);
//onclick events
const resetbtn = document.getElementById("resetDivs");
resetbtn.onclick = () => resetGrid()
createbtn.onclick = () => makeCols();
console.log(resetbtn);
//hover color event
function random (number) {
return Math.floor(Math.random() * (number +1));
}
function rainbowColor (e) {
const rndCol= 'rgb(' + random(255) + ',' + random(255) +',' + random(255) + ')';
e.target.style.backgroundColor = rndCol;
}
//grid function
function resetGrid () {
containerGrid.innerHTML =""
}
//make grid 16*16
function makeCols (col) {
for (let i = 0; i < 16*16; i++) {
const colDivs = document.createElement('div');
colDivs.setAttribute('id', 'col-row');
colDivs.classList.add('cols');
colDivs.textContent ="";
colDivs.style.border = ('solid');
colDivs.style.display= ('grid');
colDivs.style.padding = ('5px');
containerGrid.appendChild(colDivs);
}
}
makeCols (16);
let inputs = document.querySelectorAll('.cols');
for(let k=0; k<inputs.length; k++) {
inputs[k].onclick = rainbowColor;}
let resets = document.querySelectorAll('.cols');
for(let p=0; p<inputs.length; p++) {
inputs[p].onmouseover = rainbowColor;
}
.grid {
width:500px;
}
.grids {
display: grid;
justify-content:center;
align-items:center;
grid-template-columns: repeat(16,1fr);
grid-auto-rows:repeat(16,1fr);
padding: 50px 50px;
margin-left:150px;
height:100px;
width:200px;
}
.rows {
height:10px;
width:10px;
grid-column-gap:10px;
}
.cols {
height:10px;
width:10px;
color:black;
}
.palette.cols:hover {
background-color:'black';
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Etch-a-Sketch</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id ="color-picker" class = "palette">
<input type="color" name="Rainbow" id="rainbow-colors" value= "#e66465">
<label for="Rainbow">Rainbow</label>
</div>
<div id = "black-pick" class = "black-color">
<input type="color" name="Black" id="black-color" value="#rrggbb">
<label for="Black">Black</label>
</div>
<div id ="resetDivs" class= "btnReset">
<input type="button" value="Reset">
</div>
<script src="app.js"></script>
</body>
</html>
解决方案
Move your for loops into the makeCols() because when you reset it removes all the divs along with their event listeners. Before you only assigned the events on page load. You need to assign the events anytime you make new divs.
function makeCols (col) {
for (let i = 0; i < 16*16; i++) {
const colDivs = document.createElement('div');
colDivs.setAttribute('id', 'col-row');
colDivs.classList.add('cols');
colDivs.textContent ="";
colDivs.style.border = ('solid');
colDivs.style.display= ('grid');
colDivs.style.padding = ('5px');
containerGrid.appendChild(colDivs);
}
let inputs = document.querySelectorAll('.cols');
for(let k=0; k<inputs.length; k++) {
inputs[k].onclick = rainbowColor;}
let resets = document.querySelectorAll('.cols');
for(let p=0; p<inputs.length; p++) {
inputs[p].onmouseover = rainbowColor;
}
}
makeCols (16);
推荐阅读
- python-3.x - 如何迭代地将行添加到初始的空熊猫数据框?
- python-3.x - AttributeError:模块“sklearn.linear_model”没有属性“LinearRegression”
- ios - 如何将自定义字体实现到自定义键盘以在其他应用程序上使用?
- c# - 使用 asp.net Web API 将 SharePoint 列表数据检索到 JSON 格式的数据表中
- c - 为什么我们在使用 C 时需要在 main 中使用 return 语句
- javascript - 一种形式的多个按钮的 POST Ajax
- python - 无法更新 Django ArrayField
- javascript - 如何在 Postman 中获取测试状态(即通过、失败或错误)?
- c# - 当远程 SQL Server 数据库的脚手架 DbContext 时,构建失败
- angular - NestJS + Angular 项目抛出未找到模块:错误:无法解析“缓存管理器”