【问题标题】:Adding an Event Listener添加事件监听器
【发布时间】:2020-06-13 05:38:27
【问题描述】:

我们如何在代码的每个项目上只添加一次事件监听器,在 react 中进行状态管理很容易,但是我们如何在普通的旧 javascript 中做到这一点

     <div class="grid-container" id="ad">
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>   
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      <div class="grid-item" ></div>
      </div>


   let divs = document.querySelectorAll(".grid-item")

        for(let i=0;i<divs.length;i++) { 

            divs[i].addEventListener("click", function() {
            divs[i].style["background-color"] = "red";

        });
    }

【问题讨论】:

  • grid-item 中没有文字或什么都没有,那么您将在哪里处理点击??
  • 从被点击的 div.grid-item 或所有 div.grid-item 上删除eventListener

标签: javascript css dom css-selectors dom-events


【解决方案1】:

您需要使用命名函数而不是匿名函数。然后使用该命名函数删除所有侦听器,方法与添加它们的方式相同。

这是一个 jsfiddle 示例: https://jsfiddle.net/v1akgpL6/

let divs = document.querySelectorAll(".grid-item");

/* Remove all event listeners */
const removeListeners = () => {
    for (let j = 0; j < divs.length; j++) { 
    divs[j].removeEventListener("click", clickHandler);
  }
}

/* Click event listener */
const clickHandler = (e) => {
  e.currentTarget.style["background-color"] = "red";
  removeListeners();
}

/* Add event listeners */
for (let i = 0; i < divs.length; i++) {
    divs[i].addEventListener("click", clickHandler);
}

【讨论】:

    【解决方案2】:

    您可以使用事件监听器中的选项对象使事件发生一次,如下所示:

    let divs = document.querySelectorAll(".grid-item");
    const changeBackgroundColor = e => {
     e.target.style.backgroundColor = "red";
     }
    divs.forEach(div => {
     div.addEventListener("click", changeBackgroundColor, {once: true});
    })
    

    【讨论】:

    • 如何返回我点击的 div 值?
    • 你可以使用 e.target.value 或 e.currentTarget.value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多