JavaScript におけるイベント委譲メカニズムと深いコピーと浅いコピーの簡単な分析

JavaScript におけるイベント委譲メカニズムと深いコピーと浅いコピーの簡単な分析

今日はJavaScriptのイベント委譲と深いコピーと浅いコピーについてお話します

1. イベントの委任

まず、イベントバインディングを紹介しましょう

//方法 1: onclick 経由
<button onclick="clickEvent()">クリック</button>

<スクリプト>
関数 clickEvent(){
   alert("クリックイベント");
}
</スクリプト>

//方法 2: addEventListener 経由
<button id="btn_button">クリック</button>

<スクリプト>
var btn = document.getElementById("btn_button");
btn.addEventListener("クリック", 関数() {
  アラート("クリック");
}、 間違い);
</スクリプト>

違いを教えてください
onclick は 1 つのイベントのみをバインドできますが、addEventListener は複数のイベントを同時にバインドできます。

[関数メソッド1() {
  console.log("メソッド1");
}
関数メソッド2() {
  console.log("メソッド2");
}
関数メソッド3() {
  console.log("メソッド3");
}
var btn = document.getElementById("btn_button");
btn.addEventListener("click", method1, false); // 3 番目のパラメータはデフォルト値で、デフォルトではバブリングです。true に設定すると、キャプチャされます。btn.addEventListener("click", method2, false);
btn.addEventListener("click", method3, false);
// 最終的に、method1 -> method2 -> method3 の順に実行されます。 
btn.removeEventListener("click", method1, false); // イベントを削除するために使用されます btn.onclick = method1;
btn.onclick = メソッド2;
btn.onclick = メソッド3;
//最後にmethod3のみが実行されます
btn.onclick = null; // イベントを削除するために使用

イベントバブリング

<ul id="コンテナ" スタイル="display: インラインブロック;">
  <li id="title1">123456</li>
  <li id="title2">クワート</li>
  <li id="title3">
    <ul>
      <li id="title3inner">title3 内のテキスト</li>
    </ul>
  </li>
</ul>

<スクリプト>
  var コンテナ = document.getElementById("コンテナ");
  var title1 = document.getElementById("title1");
  var title2 = document.getElementById("title2");
  var title3 = document.getElementById("title3");
  var title3inner = document.getElementById("title3inner");

  コンテナ.onclick = 関数 (e) {
    アラート("コンテナ");
  }
  title1.onclick = 関数(e) {
    アラート("title1");
  }
  title2.onclick = 関数(e) {
    アラート("title2");
  }
  title3.onclick = 関数 (e) {
    アラート("title3");
  }
  title3inner.onclick = 関数 (e) {
    アラート("title3inner");
  }
</スクリプト>

title3 のテキストをクリックすると、3 つのイベントがトリガーされ、それぞれ「title3inner」->「title3」->「container」がポップアップ表示されます。

イベントキャプチャ

イベント バブリングに関しては、その逆がイベント キャプチャです。つまり、「title3 内のテキスト」をクリックすると、3 つのイベントがトリガーされ、それぞれ「コンテナー」->「title3」->「title3inner」がポップアップ表示されます。

イベントの泡立ちの昇華

イベント委任の使用

<ul id="コンテナ" スタイル="display: インラインブロック;">
  <li id="title1">123456</li>
  <li id="title2">クワート</li>
  <li id="title3">QWE123</li>
</ul>

<スクリプト>
var コンテナ = document.getElementById("コンテナ");
コンテナ.onclick = 関数 (e) {
  //コンソールログ(e);
  (e.target.id = "title1") の場合 {
    アラート(e.target.innerText);
  }
  そうでない場合 (e.target.id = "title2") {
    アラート(e.target.innerText);
  }
  そうでない場合 (e.target.id = "title3") {
    アラート(e.target.innerText);
  }
}
</スクリプト>

利点としては、クリック イベントを登録するだけで、ターゲットを使用してクリックされた特定の要素を判別できることです。 currentTarget は、イベントを登録した要素を参照します。
ターゲットは実際にクリックした要素です
currentTarget は、イベントにバインドされた要素です。イベント委任を使用しない場合は、リストで各データの後にボタンを追加し、各ボタンにイベントを登録します。各要素がイベントにバインドされている場合、ボタンの数が多いとフロントエンドのパフォーマンスに確実に影響します。現時点では、デリゲートが間違いなく最良の選択です。デリゲートは 1 つのイベントを登録するだけでよいからです。

考える

理論上、イベント委任を使用することは確かに最適化です。イベントを登録し、イベント バブリングを通じて対応する関数を実装するだけで済みます。
Vue プロジェクトでは、イベント委任を使用する必要がありますか?ここで論争があるようです。
Vue では既に実行されているという人もいれば、実行されていないという人もいます。ソースコードを読んでいないので、わかりません。

とにかく、私はこのようにして、各ボタンにイベントをバインドし、バブルを防止しました。実際には、個人的にはイベント委任はあまり考えていません。必要ないと思います。結局のところ、イベントはそれほど多くありません。

2. 深いコピーと浅いコピー

深浅コピーの知識に関しては、短くまとめて一撃で仕留めます!

a = 3 とします。
b = a とします。
a = 4;
コンソールログ(a); //4
コンソールログ(b); //3
console.log(a === b); //これはディープコピーです。a と b は完全に異なる変数であり、それぞれに値が格納されます。

arr = [1, 2, 3, 4, 5]とします。
brr = arr とします。
ar[1] = 8;
コンソール.log(arr[1]); //8
console.log(brr[1]); //8 なぜ? これは浅いコピーです。配列型は参照型です。arr 変数と brr 変数は参照アドレスのみを格納します。これらは一緒に配列 [1,2,3,4,5] を指します。console.log(arr === brr); //true

実際にディープコピーを実装したい場合はどうすればよいでしょうか?
主な方法は再帰を通じて値を割り当てることであり、もう 1 つは JSON.stringify と JSON.parse の 2 つの方法を通じて実装することです。
ここで 2 番目の方法を使用するのが最も簡単で、結局のところ、単純かつ強力であり、多くの場合、最も効果的な解決策です。

arr = [1, 2, 3, 4, 5]とします。
brr = JSON.parse(JSON.stringify(arr)) とします。
ar[1] = 8;
console.log(brr[1]); //2、これはいわゆるディープコピーを実装する

結論

面接官が言ったように、上記の知識は実際の仕事では使わないかもしれませんが、それでも知っておく必要があります!まだ知る必要があります! !まだ知る必要があります! ! !

これで、JavaScript のイベント委譲メカニズムとディープ コピーおよびシャロー コピーに関するこの記事は終了です。より関連性の高い js イベント委譲とディープ コピーおよびシャロー コピーのコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavascriptとjQueryのディープコピーとシャローコピーの詳しい説明
  • JavaScript のディープコピーとシャローコピーの詳細な分析
  • JavaScript のディープコピーとシャローコピーのプロセスの詳細な説明
  • js における深いコピーと浅いコピーの問題の簡単な分析
  • jsは配列とオブジェクトの深いコピーと浅いコピーを実装します
  • JavaScript における最も完全なディープコピーとシャローコピーの実装の詳細な説明

<<:  CentOS 7 で RPM を使用して mysql5.7.13 をインストールする

>>:  Windows で MySQL 5.7.17 圧縮バージョンをインストールするときに遭遇する落とし穴

推薦する

CSS 円形ホローイングの実装(クーポン背景画像)

この記事では主に、クーポンの背景画像などでよく使われる CSS 円形ホローイングについて紹介し、皆さ...

MySQL 8.0 のメモリ消費の詳細な分析

目次1. innodb_buffer_pool_size 2. innodb_log_buffer_...

Web デザイン スキル: iframe の適応高さの問題

おそらく、この問題にまだ遭遇していない人もいるでしょうから、まずは適応高さとは何かを説明しましょう。...

MySQLテーブルのフィールドと関連属性をエクスポートする手順

データベース内のテーブルのフィールドとプロパティをエクスポートし、テーブルを作成してWordに保存す...

外部ネットワークアクセスを許可するためのMysql5.6の設定手順の詳細を共有する

最近、MySQL 5.6 を導入しましたが、デフォルトでは MySQL はローカル サービスのみを許...

Linux オペレーティング システムで ssh/sftp を構成して権限を設定する方法

FTP と比較すると、SSH ベースの sftp サービスは、セキュリティが優れており (非プレーン...

JavaScript の矢印関数と通常の関数の違いの詳細な説明

この記事では、JavaScriptにおけるアロー関数と通常の関数の違いについて解説します。具体的な内...

TSオブジェクトのスプレッド演算子とレスト演算子の詳細な説明

目次概要オブジェクトの残り属性オブジェクトの拡張プロパティオブジェクトの浅いコピーを作成するkeyo...

jQuery はパーセンテージスコアリングの進捗バーを実装します

この記事では、パーセンテージスコアリングプログレスバーを実現するためのjQueryの具体的なコードを...

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します...

JQuery を放棄すべきでしょうか?

目次序文jQuery 以外の場合は何を使うのでしょうか? DOMとイベントAJAX リクエスト要約す...

CSS3 列を使用したカード ウォーターフォール レイアウトを実装するためのサンプル コード

この記事では、カード ウォーターフォール レイアウトを実現するための CSS3 列のサンプル コード...

CSS 表示属性のインラインブロックレイアウト実装の詳細な説明

CSS 表示プロパティ注: !DOCTYPE が指定されている場合、Internet Explore...

メモリの原則に関する詳細な説明: JS では変数はヒープに保存されるのか、スタックに保存されるのか?

目次1. 冷蔵庫に入りきらない象2. シャドウクローン文字列3. 実際に見た「奇妙なボール」 4. ...

MySQL グループレプリケーションの設定手順 (推奨)

MySQL-Group-Replication は、MySQL-5.7.17 で開発された新しい機...