如何在数组中单击按钮时执行功能?

时间:2019-03-31 01:09:48

标签: javascript html css

我在图形上布置了一个非常大的256个按钮数组(例如,示例中只有5个)。我已经在其中包含了一个事件监听器的forEach语句,但是它没有执行我想要的操作。我希望我单击的按钮变成黑色且简单,但是我尝试设置console.log来测试我的功能,每次单击一个按钮,它都会记录256次。我希望按钮仅对我在数组中单击的按钮执行操作。

let cells = document.querySelectorAll(".grid");

cells.forEach(() => {
    addEventListener("click", function(){
        target.style.backgroundColor = "black";
    });
});
body {
    margin:0;
}

#background {
    position:absolute;
    height:800px;
    width:800px;
    background-color:grey;
    top:100px;
    left:550px;
    display:grid;
    grid-template-columns: repeat(auto-fit, minmax(50px, 1fr));
}

.grid {
    display:block;
    height:50px;
    width:50px;
}

.grid:hover {
    background-color:lightgrey;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>FindMyKeys</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <div id="background">
            <div id="grid1" class="grid"></div>
            <div id="grid2" class="grid"></div>
            <div id="grid3" class="grid"></div>
            <div id="grid4" class="grid"></div>
            <div id="grid5" class="grid"></div>
                </div>
        <script src="app.js"></script>
    </body>
</html>

2 个答案:

答案 0 :(得分:2)

为什么每个人都忽略JS事件委托? (我已更改了代码段用法的css值)

document.querySelector("#background").onclick = function (e) {
  if (e.target.className !== 'grid') return;
  e.stopPropagation();
  e.target.style.backgroundColor = "black";
}
body {
  margin: 0;
}
#background {
  position: absolute;
  height: 100px;
  width: 400px;
  background-color: grey;
  top: 100px;
  left: 10px;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(50px, 1fr));
}
.grid {
  display: block;
  height: 50px;
  width: 50px;
}
#background div {
  background-color: pink;
}
.grid:hover {
  background-color: lightgrey;
}
<div id="background">
  <div id="grid1" class="grid"></div>
  <div id="grid2" class="grid"></div>
  <div id="grid3" class="grid"></div>
  <div id="grid4" class="grid"></div>
  <div id="grid5" class="grid"></div>
</div>

答案 1 :(得分:1)

只需稍微更改您的forEach

cells.forEach((cell) => {
    cell.addEventListener("click", function(event){
        event.target.style.backgroundColor = "black";
    });
});

如果单元格始终位于元素内,则可以利用事件冒泡来发挥自己的优势:

document.getElementById("background").addEventListener("click", function(event) {
    if (event.target.className == "grid") {
        event.target.style.backgroundColor = "black";
    }
});