ホームページ  >  記事  >  ウェブフロントエンド  >  jsイベントデリゲーションとは何ですか? JS イベント委任を使用する利点は何ですか?

jsイベントデリゲーションとは何ですか? JS イベント委任を使用する利点は何ですか?

不言
不言オリジナル
2018-08-29 17:37:255980ブラウズ

jsイベントデリゲーションとは何ですか?イベント委任を使用する利点は何ですか? このような疑問を持っている友人も多いと思いますので、次の記事では、js イベント委任の概念と、js イベント委任を使用する利点について説明します。

1. JSイベントデリゲーションとは何ですか?

動的要素のイベント バインディングを処理するためにイベント バブリングを使用する。専門用語をイベント委任と呼びます。簡単に言うと、イベントを親要素にバインドして、子要素のバブリング イベントを監視し、どの子要素であるかを確認することです。このイベントは、もともと特定の要素に追加されたものですが、イベントを完了するために他の要素に追加することとしてよく知られています。 (イベントとは何ですか? を参照してください: JavaScript 中国語リファレンス マニュアル)

たとえば、次の例: ネイティブ js はイベント委任を実装します

<!DOCTYPE html>
<html>
<head>
<title>事件委托测试</title>
</head>
<body>
<style type="text/css">
*{margin: 0;padding: 0;}
a{text-decoration: none;}
ul,li{list-style: none;}
div{display: block;width: 500px;padding: 200px 0 0 200px;}
div ul li{display: block;width: 100%;text-align: center;height: 35px;line-height: 35px;}
div ul li:nth-child(2n){background: #f00;}
</style>
<div>
    <ul>
        <li><a>测试1</a></li>
        <li><a>测试2</a></li>
        <li><a>测试3</a></li>
        <li><a>测试4</a></li>
        <li><a>测试5</a></li>
        <li><a>测试6</a></li>
        <li><a>测试7</a></li>
        <li><a>测试8</a></li>
    </ul>
</div>
<script type="text/javascript">
document.getElementsByTagName("ul")[0].addEventListener(&#39;click&#39;,function(e){
    alert("点击的内容是:"+e.target.innerHTML);
});
</script>
</body>
</html>

注: js がイベント委任を実装するには 3 つの手順があります:

最初のステップ: 親要素にイベントをバインドします
要素 ul にバインディング イベントを追加し、addEventListener を介してクリック イベントにバインドを追加します

ステップ 2: 子要素のバブリング イベントをリッスンします
ここでのデフォルトはバブリングです。子要素をクリックすると、バブルが表示されます

ステップ 3: イベントの発生元である子要素を見つけます

匿名コールバック関数のパラメータ e は、イベント オブジェクトを受け取るために使用されます。トリガーされたイベントのターゲットは target

2 を通じて取得されます。 js イベント委任の利点:

イベント委任の利点 1: イベント委任テクノロジにより、各単語要素へのイベント リスナーの追加が回避され、操作の数が削減されます。 DOM ノードにより、ブラウザーの再描画と再配置が減り、コード効率のパフォーマンスが向上します。

例を見てみましょう: li を動的に追加する必要があります。ボタンをクリックして li

<input type="button" id="btn" /><ul id="ul">
  <li>aaaaaaaa</li>
  <li>bbbbbbbb</li>
  <li>cccccccc</li></ul>

を動的に追加します。 イベント委任なしで次のようにします:

window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");
  var oBtn = document.getElementById("btn");
  var iNow = 4;
  for(var i=0; i<aLi.length; i++){
    aLi[i].onmouseover = function(){
      this.style.background = "red";
    }
    aLi[i].onmouseout = function(){
      this.style.background = "";
    }
  }

  oBtn.onclick = function(){
    iNow ++;
    var oLi = document.createElement("li");
    oLi.innerHTML = 1111 *iNow;
    oUl.appendChild(oLi);
  }

  
}

このようにして、ボタンをクリックして背景色を変更したときに、新しく追加された li にマウス移動イベントがないことがわかります。

「追加」をクリックした時点で、for ループはすでに実行されているためです。

次に、イベント委任を使用してそれを行います。つまり、HTML は変更されません

window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");
  var oBtn = document.getElementById("btn");
  var iNow = 4;

  oUl.onmouseover = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    //alert(target.innerHTML);
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "red";
    }
  }
  oUl.onmouseout = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    //alert(target.innerHTML);
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "";
    }
  }
  oBtn.onclick = function(){
    iNow ++;
    var oLi = document.createElement("li");
    oLi.innerHTML = 1111 *iNow;
    oUl.appendChild(oLi);
  }
}

イベント委任のメリット 2: イベント委任を使用すると、親要素のみが DOM と対話し、その他の操作は JS 仮想メモリ内で完了するため、パフォーマンスが大幅に向上します。

関連する推奨事項:

js でのイベント委任

JavaScript イベント委任と jQuery イベント バインディングのオン、オフ、1 つ

以上がjsイベントデリゲーションとは何ですか? JS イベント委任を使用する利点は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。