带有classList的querySelectorAll()上的addEventListener

时间:2018-06-01 12:20:45

标签: javascript addeventlistener

我正在尝试添加一个事件监听器,但没有结果。我知道Javascript有一个提升功能,但我相信除了正确的解决方案之外我都尝试了所有功能。Pen

const cbox = document.querySelectorAll(".box");
function doit() {
    for(let i = 0; i < cbox.length; i++){
        cbox[i].classList.add("red");
    }
}
cbox.addEventListener("click", doit,false);

有人能发现我犯的错误吗?感谢。

3 个答案:

答案 0 :(得分:7)

ES6使其更简单:

document.querySelectorAll(".box").forEach(box => 
    box.addEventListener("click", () => box.classList.toggle("red"))
);

示例实现:

document.querySelectorAll(".box").forEach(box => 
    box.addEventListener("click", () => box.classList.toggle("red"))
);
.box {
    width: 5rem;
    height: 5rem;
    background-color: yellowgreen;
    display: inline-block;
}

.box.red {
    background-color: firebrick;
}
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>

答案 1 :(得分:1)

代码与您提供的链接之间存在一些差异。那里没有函数function my function(a,b,c) { hello('world') call_in_the_middle('arg') call_something() call_else() bye('world) } 。您已将doit()附加到addEvenListener

中的NodeList

尝试以下方法:

cbox.addEventListener("click",.....
const cbox = document.querySelectorAll(".box");

 for (let i = 0; i < cbox.length; i++) {
     cbox[i].addEventListener("click", function() {
       cbox[i].classList.toggle("red");
     });
 }
*,
html,
body {
    padding: 0;
    margin: 0;
}

.box {
    width: 10rem;
    height: 10rem;
    background-color: yellowgreen;
    float: left;
    position: relative;
    margin: 0.5rem;
    transition: .5s all;
}

h3 {
    display: block;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.box:not(:first-child) {
    margin-left: 1rem;
}

.red {
    background-color: orangered;
}

答案 2 :(得分:0)

你可以在课堂上使用forEach,也可以使用事件委派。

const cboxes = document.querySelectorAll(".box");
function doit() {
    ... do something ...
}
cboxes.forEach(
  function(cbox) {
   cbox.addEventListener("click", doit,false);
  }
);

请注意,我更改了您的变量名称。

<强> EventDelgation

HTML:

<div id="parent">
  <div id="box1" class="box box1">
    <h3>Box 1</h3>
  </div>
  <div id="box2" class="box box2">
      <h3>Box 2</h3>
  </div>
  <div id="box3" class="box box3">
      <h3>Box 3</h3>
  </div>
  <div id="box4" class="box box4">
      <h3>Box 4</h3>
  </div>
</div>

JS部分:

const parent = document.querySelector("#parent");

parent.addEventListener('click', (e) => {
  e.target.classList.add('red');
  console.log(e.target);
});

事件委托更好,它使用更少的资源,因为你只使用1个事件监听器而不使用循环。