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 圧縮バージョンをインストールするときに遭遇する落とし穴

推薦する

mysql8.0.21 のダウンロードとインストールに関する詳細なチュートリアル

公式ウェブサイトアドレス: https://www.mysql.com/インストールの提案: インス...

MYSQLについては、データ型と操作テーブルを知る必要があります

データ型と操作データテーブル1.1 MySQL 型: 整数 1.2 MySQL データ型: 浮動小数...

Node.js における path.join() の利点の分析

文字列連結ではなく path.join() メソッドを使用する必要があるのはなぜか疑問に思うかもしれ...

MYSQL SERVER のログファイルを縮小する方法

トランザクション ログには、関連するデータベースに対する操作が記録され、データベースの回復に関連する...

dockerネットワーク双方向接続の詳細な説明

Dockerネットワークを見るdocker ネットワーク ls [root@master ~]# d...

WeChatアプレットキャンバスが署名機能を実装

WeChatアプレットプロジェクトでは、開発モジュールに手書き署名機能が含まれ、WeChatアプレッ...

CSSカスタムプロパティの予備的な理解

現在、CSS プリプロセッサは Web 開発の標準となっています。 プリプロセッサの主な利点の 1 ...

DockerでGDBを使用するときにブレークポイントを入力できない問題を解決する

質問docker で gdb を実行すると、ブレークポイントに到達しますが、ブレークポイントに入るこ...

HTMLで細い線のテーブルを作成する簡単な例

この細線の表を作成する方法については、Baidu で検索すると、表に対して border="...

backgroundImage を使用して画像カルーセルの切り替えを解決する詳細な説明

単一のDOMノードでカルーセルを実装するbackgroundImage を使用すると、複数の画像を追...

HTMLの基本概念の詳細な説明

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 •HTML...

Reactマウスの複数選択機能の設定方法

一般的に、リストには選択機能があり、単一選択、二重選択、複数選択が非常に一般的です。カスタム ループ...

CSS の複数行テキストがオーバーフローする場合の省略記号の例

複数行のテキストがオーバーフローすると省略記号が表示されますこの記事では 2 つの方法を推奨します。...

MySQL データベースの最適化に関する 9 つのヒント

目次1. 最も適切なフィールド属性を選択する2. フィールドをNOT NULLに設定してみる3. サ...

Axios の二次カプセル化の例 プロジェクトのデモ

1. なぜパッケージングを行うのですか?全体的なコード呼び出し、リクエストの公開処理、パーソナライズ...