html 使用onclick和querySelectorAll()更改两个div的属性

jfgube3f  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(635)

我有多个元素被分成两个div。第一个div包含一个文本,第二个div包含一个颜色。当我点击一个元素时,文本和颜色应该会改变,如果我再次点击它,它应该会变回来。问题是无论我点击哪个,总是最后一个改变。
HTML部分:

<style>
    .colorGreen {
        background-color: green;
    }

    .colorRed {
        background-color: red;
    }
</style>

<div class="box2">Text1</div>
<div class="box1 colorGreen">O</div>
<div class="box2">Text1</div>
<div class="box1 colorGreen">O</div>
<div class="box2">Text1</div>
<div class="box1 colorGreen">O</div>

JavaScript部分:

<script type='text/javascript'>
    var box1Temp = document.querySelectorAll(".box1");
    var box2Temp = document.querySelectorAll(".box2");
    for (var i = 0; i < box1Temp.length; i++) {
        var box1 = box1Temp[i];
        var box2 = box2Temp[i];
        box2.onclick = box1.onclick = function() {
            if (box1.classList.contains("colorGreen")) {
                box1.classList.add("colorRed");
                box1.classList.remove("colorGreen");
                box2.innerHTML = "Text2";
            } else {
                box1.classList.add("colorGreen");
                box1.classList.remove("colorRed");
                box2.innerHTML = "Text1";
            }
        }
    }
</script>

当我只使用一个div时,它是有效的。然后我可以使用'this',而不是'box1'变量,来寻址正确的元素。但是如果我用'this'替换'box1',它仍然是文本div发生了变化。(我知道这是显而易见的,但我迷路了)

q5iwbnjs

q5iwbnjs1#

通过一些小的调整,可以更清晰地编写:
第一个

rryofs0p

rryofs0p2#

你的代码很混乱
您选择this是正确的。
您可以使用简单onclick函数:
第一个

im9ewurl

im9ewurl3#

我认为以下代码片段将帮助您获得所需结果

let box1  = document.querySelectorAll(".box1");
let box2  = document.querySelectorAll(".box2");

box1.forEach((b1,i) => {
  b1.addEventListener("click",(ev) => {
    ev.target.classList.toggle("colorGreen");
    ev.target.classList.toggle("colorRed");
    console.log(box2[i]);
    if(ev.target.classList.contains("colorGreen")){
      box2[i].textContent = "Text1";
    }else{
      box2[i].textContent = "Text2"
    }
  })
})

相关问题