【问题标题】:8x8 div matrix onclick effectivization8x8 div 矩阵 onclick 有效化
【发布时间】:2019-02-28 22:18:14
【问题描述】:

我想要一个 8x8 矩阵,我可以在其中单击每个方块,颜色会发生变化,以便在项目中使用。

我已经制作了一个二维数组和整个 8x8“板”,但现在我想在点击时更改颜色,尽管我能想到的唯一方法是通过繁重的代码,例如编写 div[row][column] 64次...

var div = new Array(8);
for(var i = 0; i<8; i++){
div[i] = new Array(8)
}


for (var i = 0; i < 8; i++) {
for (var j = 0; j < 8; j++) {
    div[i][j] = document.createElement("div");
    div[i][j].style.width = "50px";
    div[i][j].style.height = "50px";
    div[i][j].style.backgroundColor = "white";
    document.getElementById("container").appendChild(div[i][j]);
}
var jump = document.createElement("br");
document.getElementById("container").appendChild(jump);
}

div[0][0].onclick = function(){
if(div[0][0].style.backgroundColor == "white"){
    div[0][0].style.backgroundColor = "red"
    d00 = 1
}
else{div[0][0].style.backgroundColor = "white"
d00 = 0
}
}

以上64次我不想写,肯定有更好的办法。

#container {
margin: auto;
width:400px;
height:400px;
}
#container div {
display:inline-block;
vertical-align:top;
outline: 1px solid black
}

【问题讨论】:

    标签: javascript html arrays matrix 2d


    【解决方案1】:

    您可以将onclick事件附加到父容器并使用event.target获取触发事件的div:

    document.getElementById("container").onclick = function(event){
      if(event.target.style.backgroundColor == "white"){
        event.target.style.backgroundColor = "red";
      }
      else{
        event.target.style.backgroundColor = "white";
      }
    }
    

    【讨论】:

    • 我如何获得有关点击了 div[i][j] 的信息?
    • @Maiki event.target 将是导致 onclick 事件的最内层元素。在这种情况下,这将是代表网格上一个正方形的小 div。
    • 为每个 onclick 事件创建了一个函数:function truedivs(){ for(var i = 0; i
    • @Maiki 我只想将 if 语句更改为 if(div[i][j].style.backgroundColor === "red")
    【解决方案2】:

    确实,有更好的方法。 在 for 循环中,您已经在设置 ​​DIV 的重要属性。这是附加 click 事件侦听器的理想场所,该事件侦听器的回调函数将处理颜色切换。

    像这样修改for循环:

    var divElement;
    for (var i = 0; i < 8; i++) {
      for (var j = 0; j < 8; j++) {
        divElement = document.createElement("div");
        divElement.style.width = "50px";
        divElement.style.height = "50px";
        divElement.style.backgroundColor = "white";
        divElement.addEventListener("click", changeColor);
        document.getElementById("container").appendChild(divElement);
      }
    

    并使用这个函数来实际改变颜色:

    function changeColor(e) {
      if (e.target.style.backgroundColor == "white") {
        e.target.style.backgroundColor = "red"
        d00 = 1
      } else {
        e.target.style.backgroundColor = "white"
        d00 = 0
      }
    }
    

    e.target 指的是触发事件的对象。 原谅我,我不知道d00的目的。

    【讨论】:

    • 谢谢,目的是为了以后,我打算用我的树莓派和一个物理的 8x8 LED 矩阵来运行一个 websocket。
    • 虽然我收到错误“未捕获的类型错误:无法读取 8x8.js:24 处未定义的属性 '8'”; js:24 是 div[i][j].addEventListener("click", changeColor);
    • 呵呵,是的,这是因为 div[i][j] 和存储在所有数组元素中的值 8。尽管我必须说 EJC 提供的答案是这样做的更优雅的方式,但我修改了我的答案以解决这个问题,因为您只需要一个 eventListener。
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    相关资源
    最近更新 更多