最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中事件委托的示例詳解

 更新時間:2022年07月19日 08:14:52   作者:前端西瓜哥  
所謂事件委托,就是將原本應(yīng)該在當(dāng)前元素綁定的事件,放到它的祖先元素上,讓祖先元素來委托處理。今天我們來認(rèn)識一下JS中的事件委托

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

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

事件流

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

事件流由兩階段組成:

  • 捕獲事件
  • 冒泡事件

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

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

第一個參數(shù)是事件名,第二個參數(shù)是事件響應(yīng)函數(shù),可以拿到當(dāng)前的事件對象。

第三個參數(shù)是可選的,表示監(jiān)聽的是否為捕獲階段,false為冒泡階段,也是默認(rèn)值,true 為捕獲階段。我們常用的是冒泡階段。

當(dāng)我們點(diǎn)擊元素時,就會執(zhí)行這個函數(shù)。

假設(shè)我們的 DOM 結(jié)構(gòu)如下:

<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>

現(xiàn)在我們點(diǎn)擊 card 文字時,DOM 就會產(chǎn)生事件流。

事件流首先會進(jìn)入 捕獲階段,從根節(jié)點(diǎn)往目標(biāo)元素(div#card)移動,依次經(jīng)過為:

  • window

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

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

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

然后再執(zhí)行 冒泡階段,然后反著再經(jīng)過一遍這些節(jié)點(diǎn)。

圖片

我們會根據(jù)事件流經(jīng)過的順序,依次執(zhí)行這些節(jié)點(diǎn)上綁定的對應(yīng)事件函數(shù)。

事件委托

假如我有一個好友列表,我希望點(diǎn)擊 “聊天” 按鈕,拿到對應(yīng)用戶 id,創(chuàng)建并進(jìn)入到對應(yīng)用戶的聊天會話中。

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

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

節(jié)點(diǎn)少的時候還好,如果節(jié)點(diǎn)多達(dá)上千上萬個,就需要聲明相當(dāng)多的事件函數(shù),比較消耗內(nèi)存。而且 如果列表經(jīng)常發(fā)生動態(tài)變更,也會導(dǎo)致大量事件監(jiān)聽的移除和綁定。

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

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

在上面這個例子中,我們可以將事件綁定到 ul 節(jié)點(diǎn)上,執(zhí)行函數(shù)時,通過 event 對象拿到必要的信息,進(jìn)行統(tǒng)一的操作。

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

通過 event.target 我們能獲得這次事件流的目標(biāo)節(jié)點(diǎn),然后從該節(jié)點(diǎn)對象中提取出需要的信息。

在這里我們需要拿到用戶 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 有多少,更新多頻繁,我們只需要維護(hù)一個函數(shù)就夠了。

結(jié)尾

事件委托,其實(shí)就是將原本應(yīng)該綁定在子元素的的大量類似的事件監(jiān)聽函數(shù),改為綁定到父元素或祖先元素上,委托祖先元素來處理。

不過在實(shí)際開發(fā)中,需要用到事件為委托的場景還是比較少,因?yàn)槲覀兊牧斜硗ǔ2粫L。

到此這篇關(guān)于JavaScript中事件委托的示例詳解的文章就介紹到這了,更多相關(guān)JavaScript事件委托內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript和jquery實(shí)現(xiàn)設(shè)置和移除文本框默認(rèn)值效果代碼

    javascript和jquery實(shí)現(xiàn)設(shè)置和移除文本框默認(rèn)值效果代碼

    這篇文章主要介紹了javascript和jquery實(shí)現(xiàn)設(shè)置和移除文本框默認(rèn)值效果代碼,本文實(shí)現(xiàn)的是類似html5 placeholder(空白提示)一種效果,需要的朋友可以參考下
    2015-01-01
  • 用cookies實(shí)現(xiàn)的可記憶的樣式切換效果代碼下載

    用cookies實(shí)現(xiàn)的可記憶的樣式切換效果代碼下載

    比較不錯的用cookies實(shí)現(xiàn)的可記憶的樣式切換效果,這個思路也在一定程序,方便客戶的長期使用。
    2007-12-12
  • 微信小程序圖片上傳功能的實(shí)現(xiàn)方法

    微信小程序圖片上傳功能的實(shí)現(xiàn)方法

    在編寫小程序的項(xiàng)目過程中,難免會有需要上傳圖片,下面這篇文章主要給大家介紹了關(guān)于微信小程序圖片上傳功能的實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • checkbox選中與未選中判斷示例

    checkbox選中與未選中判斷示例

    本節(jié)主要介紹了checkbox選中與未選中的判斷方法,需要的朋友可以參考下
    2014-08-08
  • JavaScript實(shí)現(xiàn)圖片滑動切換的代碼示例分享

    JavaScript實(shí)現(xiàn)圖片滑動切換的代碼示例分享

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)圖片滑動切換的代碼示例分享,能夠控制包括滑動時間和切換數(shù)量等,需要的朋友可以參考下
    2016-03-03
  • 如何動態(tài)加載外部Javascript文件

    如何動態(tài)加載外部Javascript文件

    這篇文章主要介紹了如何動態(tài)加載外部Javascript文件,本文舉例講解使用js加載器動態(tài)加載外部Javascript文件,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 五句話幫你輕松搞定js原型鏈

    五句話幫你輕松搞定js原型鏈

    這篇文章主要給大家介紹了關(guān)于js原型鏈的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JavaScript中的事件委托及好處

    JavaScript中的事件委托及好處

    事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是讓別人來做,這個事件本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件,本文給大家重點(diǎn)介紹js中的事件委托及好處,一起看看吧
    2016-07-07
  • 微信小程序如何修改本地緩存key中單個數(shù)據(jù)的詳解

    微信小程序如何修改本地緩存key中單個數(shù)據(jù)的詳解

    這篇文章主要介紹了微信小程序如何修改本地緩存key中單個數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用js獲取地址欄參數(shù)的方法推薦(超級簡單)

    使用js獲取地址欄參數(shù)的方法推薦(超級簡單)

    下面小編就為大家?guī)硪黄褂胘s獲取地址欄參數(shù)的方法推薦(超級簡單)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

来安县| 措美县| 呼伦贝尔市| 平顶山市| 广昌县| 安仁县| 鹿泉市| 西丰县| 谷城县| 吉安市| 福海县| 历史| 石渠县| 修文县| 贺兰县| 建宁县| 镇远县| 闽清县| 宝山区| 新竹县| 荆州市| 呈贡县| 兴安县| 虞城县| 青浦区| 黑山县| 瑞丽市| 南澳县| 清原| 五家渠市| 长岭县| 长子县| 新沂市| 梁山县| 溧水县| 华池县| 玉屏| 恭城| 雅安市| 罗城| 扶沟县|