成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JS 中的事件委托是什么

開發 前端
事件委托,其實就是將原本應該綁定在子元素的的大量類似的事件監聽函數,改為綁定到父元素或祖先元素上,委托祖先元素來處理。

大家好,我是前端西瓜哥。今天我們來認識一下事件委托。

所謂事件委托,就是將原本應該在當前元素綁定的事件,放到它的祖先元素上,讓祖先元素來委托處理。

事件流

事件流指從頁面中接收事件的順序,也可理解為事件在頁面中傳播的順序。

事件流由兩階段組成:

  1. 捕獲事件
  2. 冒泡事件

我們通常用 addEventListener 給元素添加事件:

document.querySelector('#card')addEventListener(  'click',  function (event) {   console.log('div#card 冒泡點擊', event); },  false);

第一個參數是事件名,第二個參數是事件響應函數,可以拿到當前的事件對象。

第三個參數是可選的,表示監聽的是否為捕獲階段,false為冒泡階段,也是默認值,true 為捕獲階段。我們常用的是冒泡階段。

當我們點擊元素時,就會執行這個函數。

假設我們的 DOM 結構如下:

<html>  <head>    <title>前端西瓜哥</title>    <meta charset="UTF-8" />  </head>  <body>    <div id="app">      <div id="box-1">        <div id="card">card</div>      </div>      <div id="box-2"></div>    </div>  </body></html>

現在我們點擊 card 文字時,DOM 就會產生事件流。

事件流首先會進入 捕獲階段,從根節點往目標元素(div#card)移動,依次經過為:

  • window
  • document(文檔根元素,在 HTML 中沒有顯式聲明)
  • document.documentElement(<html>
  • document.body(<body>
  • ...
  • 目標元素 div#card

和調用事件對象的 event.composedPath() 方法拿到的 事件路徑 類似。

window 看起來是個全局變量,但它也是可以綁定事件的,比如窗口大小改變的 resize 事件就只能綁定到 window 上,而不能綁定到 document 上。

然后再執行 冒泡階段,然后反著再經過一遍這些節點。

我們會根據事件流經過的順序,依次執行這些節點上綁定的對應事件函數。

事件委托

假如我有一個好友列表,我希望點擊 “聊天” 按鈕,拿到對應用戶 id,創建并進入到對應用戶的聊天會話中。

<ul>  <li>前端西瓜哥<button>聊天</button></li>  <li>fe_watermelon<button>聊天</button></li>  <!-- ... -->  <li>老王<button>聊天</button></li></ul>

最直接的方式是給所有的 button 元素都綁定各自的事件。

節點少的時候還好,如果節點多達上千上萬個,就需要聲明相當多的事件函數,比較消耗內存。而且 如果列表經常發生動態變更,也會導致大量事件監聽的移除和綁定。

在這種情況下,事件委托就大有可為了。

事件委托正是利用事件流的冒泡特性,將本來要綁定到多個元素的事件函數,委托到了其祖先元素上。

在上面這個例子中,我們可以將事件綁定到 ul 節點上,執行函數時,通過 event 對象拿到必要的信息,進行統一的操作。

document.querySelector('ul').addEventListener('click', (event) => {  const target = event.target;  const userId = target.getAttribute('data-user-id');  if (userId) {    joinChat(userId);  }});

通過 event.target 我們能獲得這次事件流的目標節點,然后從該節點對象中提取出需要的信息。

在這里我們需要拿到用戶 id,所以需要給 button 元素添加類似 data-user-id 的自定義屬性,像這樣子:

<ul>  <li>前端西瓜哥<button data-user-id="5">聊天</button></li>  <li>fe_watermelon<button data-user-id="99">聊天</button></li>  <!-- ... -->  <li>老王<button data-user-id="63">聊天</button></li></ul>

這樣,不管 li 有多少,更新多頻繁,我們只需要維護一個函數就夠了。

結尾

事件委托,其實就是將原本應該綁定在子元素的的大量類似的事件監聽函數,改為綁定到父元素或祖先元素上,委托祖先元素來處理。

不過在實際開發中,需要用到事件為委托的場景還是比較少,因為我們的列表通常不會太長。

責任編輯:姜華 來源: 今日頭條
相關推薦

2011-06-16 14:38:18

JavaScript事件委托

2009-08-18 11:08:24

.Net Framew

2024-05-16 13:36:04

C#委托事件

2009-08-03 13:23:04

C#編程組件-事件-委托

2024-05-15 09:11:51

委托事件C#

2022-06-29 08:37:03

事件循環JS 語言

2024-06-28 10:19:02

委托事件C#

2011-06-30 10:28:50

C#開發

2016-09-14 21:28:25

JavaScript事件代理委托

2024-06-25 08:43:25

C#編程模型

2016-10-20 19:07:10

Javascript事件冒泡與捕獲

2009-09-10 15:32:54

事件與委托

2011-06-16 15:14:17

VB.NET事件委托

2024-02-04 17:16:22

ReactVue前端

2009-08-18 10:54:17

C#事件和委托

2009-08-04 13:53:58

C#委托類C#事件

2009-03-26 10:11:47

2024-01-05 08:49:15

Node.js異步編程

2009-08-27 16:53:01

C#委托C#事件

2021-04-26 07:51:00

JavaScript方法函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一级 | 亚洲日本中文字幕在线 | 久热精品在线观看视频 | 久久久久久国产精品 | 国产精品久久久久久久岛一牛影视 | 一区二区视频在线 | 日韩精品一区二区三区 | 久久av网站 | 91亚洲精 | 色久五月 | 99在线视频观看 | 久久精品一| 亚洲欧洲一区二区 | 91精品久久久久久久久 | 欧美黑人激情 | 日韩一区不卡 | 国产高清视频一区 | 三级av在线 | 精品欧美一区二区精品久久 | 日韩一二三区视频 | 91精品欧美久久久久久久 | 成人在线一区二区 | 久久久久免费 | 国产精品一区二区视频 | 在线综合视频 | 91福利影院 | 欧美11一13sex性hd | 激情视频中文字幕 | 久久一 | 高清黄色网址 | 一区二区在线不卡 | 日本精品久久久久久久 | 五月综合激情网 | 欧美精品一区二区在线观看 | 免费国产成人av | 久久激情视频 | www日本高清 | 精品国产乱码久久久久久图片 | 久久在看 | 久久成人一区二区三区 | 久久九九影视 |