JS事件委托

131 阅读1分钟

首先事件委托是什么? 比如,一个div,里面包含了20个div子节点,此时需要为20个子节点绑定事件,如果不使用事件委托,那就需要获取到20个子节点数组,并且遍历这个数组为每一个子节点绑定事件。但是如果使用事件委托,那么只需要为他的父亲绑定事件即可。

事件委托的优点: 优化性能,节约内存
如果有1w的子节点,那么1w的子节点需要绑定1w个事件,JS为每个节点绑定事件都是需要耗费性能和内存的,并且如果后续还需要添加子节点,也不需要再去重复添加事件

他并不是什么高级东西,一看就懂。我之前一直以为这玩意可麻烦所以懒得去搞,但是最近突然遇到了这个问题,让我意识到逃避是不能解决问题滴。学他丫的!!!

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <style>
    .target {
      width: 100px;
      height: 20px;
      background: #35662b;
      text-align: center;
      color: #ffffff;
      margin: 10px;
      padding: 5px;
    }
    #success {
      width: 200px;
      height: 300px;
      background: #fd9191;
      margin: 0px 10px;
      text-align: center;
    }
    #failed {
      width: 200px;
      height: 300px;
      background: #32ccf7;
      text-align: center;

    }
  </style>

  <body>
    <div id="par">
      <div class="target" draggable="true">challenger1</div>
      <div class="target" draggable="true">challenger2</div>
      <div class="target" draggable="true">challenger3</div>
      <div class="target" draggable="true">challenger4</div>
    </div>

    <div style="display: flex">
      <div id="success">
        <h1>success</h1>
      </div>
      <div id="failed">
        <h1>failed</h1>
      </div>
    </div>
  </body>

  <script>
    let target = null;

    // 使用事件委托
    const par = document.querySelector("#par");
    par.addEventListener("dragstart", function (event) {
      target = event.target;
      event.dataTransfer.setData("text/plain", event.target.value);
    });

    //   不使用事件委托
    // const targets = document.getElementsByClassName("target");
    // for (let i = 0; i < targets.length; i++) {
    //   targets[i].addEventListener(
    //     "dragstart",
    //     function (evnt) {
    //       target = event.target;
    //       event.dataTransfer.setData("text/plain", event.target.value);
    //     },
    //     false
    //   );
    // }

    document.addEventListener(
      "drop",
      function (event) {
        let currentDom = event.target;
        console.log(currentDom);
        if (currentDom.id === "success" || currentDom.id === "failed") {
          currentDom.appendChild(target);
          console.log(event.dataTransfer.getData("text/plain"));
        }
      },
      false
    );

    /* 
        监听 dragover 事件,并且 event.preventDefault()
        否则  document 监听drop将不会触发
    */
    document.addEventListener(
      "dragover",
      function (event) {
        event.preventDefault();
      },
      false
    );
  </script>
</html>

代码就放在这里,小伙伴们自行拿去尝试即可。