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

推薦する

docker compose を使用して fastDFS ファイル サーバーを構築する方法

前回の記事では、docker compose を使用して FastDfs ファイル サーバーをインス...

vue 動的コンポーネント

目次1. コンポーネント2. キープアライブ2.1 問題点2.2 キープアライブを使って解決する2....

JS でカルーセル画像を実装するいくつかの方法

カルーセル主なアイデアは次のとおりです。大きなコンテナには、コンテナの幅の整数倍の非常に長いテーブル...

CentOS 7 での mysql 5.7 のインストール チュートリアル

1. 公式MySQL Yumリポジトリをダウンロードしてインストールする 実行ファイル: mysql...

MYSQL8.0.13 無料インストール版 設定チュートリアル例 詳細説明

1. ダウンロード、例として8.0を取り上げますダウンロードアドレス: https://dev.my...

JS で単一ファイルコンポーネントを実装する方法

目次概要単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

SWFObjectを使用すると、HTMLにFlashを挿入する際のブラウザ互換性の問題を完全に解決できます。

一緒に学びましょう1. 伝統的な方法コードをコピーコードは次のとおりです。 <object c...

HTMLフォーム属性のreadonlyとdisabledの使い方

1. readonly 読み取り専用属性なので、値を取得できます2. 無効: 無効な属性、値を取得で...

MySQL 5.7.11 zip インストールと設定方法のグラフィックチュートリアル

1. MySQL 5.7.11 zipインストールパッケージをダウンロードするこのマシンはwin7 ...

新しい CSS display:box プロパティの詳細な説明

1. ディスプレイボックス;要素にこのプロパティを設定すると、display:inline-bloc...

MySQL Group by最適化の詳細な説明

目次標準的な実行プロセス最適化並べ替えを削除並べ替え成し遂げる要約する標準の Group by ステ...

Linux で文字列を整理するためのヒント

Linuxの操作では、ファイル内の文字列を置換したりカウントしたりすることが多いです。ここでまとめを...

Windows で mysql 8.0.12 をインストールするための詳細なチュートリアル

この記事では、MySQL 8.0.12のインストール方法に関する詳細なチュートリアルを参考までに紹介...

ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

最近、Yahoo の 34 の黄金律を読み、ウェブサイトのパフォーマンスを最適化する方法を学びました...