元旦過後,新年第一篇。
初衷:很多的面試都會涉及到事件委託,前後後也看過好多博文,寫的都很不錯,寫的各有千秋,自己思前想後,為了以後自己的查看,也同時為現在找工作的前端小夥伴提供一個看似更全方位的解讀事件委託的地方來認識了解他的原理,本篇文章匯總了兩個版本的事件委託:javascript、jquery;
事件委託的定義:
利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。
事件委託的優勢:
在js中加入到頁面上的事件處理程序的數量直接影響到網頁的運作效能。因為每個事件處理函數都是一個對象,是對象就會佔用內存,而內存中對象越多,導致的結果就是性能越差;而訪問dom的次數越多,就會引起結構的重繪或者重排的次數也隨之增多,會延遲整個頁面的互動就緒時間;
對於在頁面進行處理過後新增的dom元素,運用事件委託可以為新增的dom元素一併增減事件處理程序;
在下面的程式碼中p標籤要實現的效果是滑鼠點擊p標籤的時候背景色變為紅色,以下是js、jq的處理方法
<p> </p><p>第一个p</p> <p>第二个p</p> <p>第三个p</p> <p> </p><p>这是子集菜单</p> <p>我是子集的p </p><p>我是子集的p</p> <button>点击加一</button>
一、js事件委託
在js中不用事件委託的情況:取得頁面中所有的p標籤然後用for迴圈遍歷給每一個元素增加事件處理函數
let nodes = document.getElementById("nodes"); let ps = document.getElementsByTagName("p"); console.log(ps); let btn = document.getElementsByTagName("button")[0]; let inner = 33; btn.onclick = function() { inner++; let p = document.createElement("p"); p.innerHTML = inner + "新增的p标签啊"; nodes.appendChild(p); console.log(ps); }; for (let i= 0;i<ps.length><p>這時候在瀏覽器中運行之後進行測試,發現如圖一所示的結果;</p><p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/376/157/896/1593567746839219.png?x-oss-process=image/resize,p_40" class="lazy" title="1593567746839219.png" alt="javascript事件委託和jquery事件委託"></p><p>那麼js不用事件委託怎麼給新增加的標籤添加事件處理函數呢?解決方案如下:</p><pre class="brush:php;toolbar:false">let nodes = document.getElementById("nodes"); let ps = document.getElementsByTagName("p"); console.log(ps); let btn = document.getElementsByTagName("button")[0]; let inner = 33; btn.onclick = function () { inner++; let p = document.createElement("p"); p.innerHTML = inner + "新增的p标签啊"; nodes.appendChild(p); addEvent();//将新dom元素增加到页面后再执行循环函数 console.log(ps); }; function addEvent() { for (let i = 0; i <p>這時候瀏覽器中運行如圖二所示:</p><p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/129/624/157/1593567770605067.png?x-oss-process=image/resize,p_40" class="lazy" title="1593567770605067.png" alt="javascript事件委託和jquery事件委託"></p><p>#這時候雖然解決了為新增dom元素增加事件處理函數的問題,但是仔細考慮他的性能卻是比之前都有所下降,究其原因就是又增加了一個事件處理函數(對象),又一次佔用了內存;所以,這個時候就會用到事件委託,這時候事件委託的優勢也有所體現:</p><pre class="brush:php;toolbar:false">let nodes = document.getElementById("nodes"); let ps = document.getElementsByTagName("p"); console.log(ps); let btn = document.getElementsByTagName("button")[0]; let inner = 33; btn.onclick = function () { inner++; let p = document.createElement("p"); p.innerHTML = inner + "新增的p标签啊"; nodes.appendChild(p); console.log(ps); }; //事件委托,为nodes指定一个事件处理函数,处理nodes下为p标签的所有元素的cilck事件 nodes.onclick= function(e){ let ev = e || window.event let target = ev.target || ev.srcElement //srcElement IE浏览器 //这里要判被处理元素节点的名字,也可以增加相应的判断条件 target.nodeName.toLowerCase() == 'p'||target.nodeName.toLowerCase() == 'span',但是要注意不要使用父级元素的名称,因为再点击子元素之间的空气的时候,由于事件冒泡他会给父级元素也增加相应的事件处理函数;因为返回的节点名称一般都是大写,所以这时要用toLowerCase()处理一下; if(target.nodeName.toLowerCase() == 'p'){ target.style.background = 'green' } }
這時候瀏覽器中運行的結果如圖三所示:
二、jquery事件委託:
相較於js事件委託,jquery事件委託的優勢:執行事件委託的時候只有子元素會觸發事件函數,而代為執行的父元素不會觸發事件函數,因此不用去判斷元素節點的名稱;(注意這裡的事件委託用的方法on,如果用bind方法父元素會觸發事件函數)
這裡nodes節點下所有標籤為p的子節點都被賦予事件處理函數;這裡的子節點還可以是多個類似' p,span',需要注意這裡面也不可以寫同nodes一樣的標籤,否則點擊元素之間的間隔會給nodes下的p賦予事件處理函數;如例二:
例一:
let inner = 33; //这里nodes节点下所有标签为p的子节点都被赋予事件处理函数;这里的子节点还可以是多个类似' p,span',需要注意这里面也不可以写同nodes一样的标签,否则点击元素之间的间隔会给nodes下的p赋予事件处理函数 $('#nodes').on('click','p',function(e){ let target = $(e.target) target.css('backgroundColor','red') }) $('button').click(()=>{ inner++; $('#nodes').append($('<p>我是新增加的p标签'+inner+'</p>')) })
瀏覽器運行的效果如圖四所示:
範例二:
<p> </p><p>第一个p</p> <p>第二个p</p> <p>第三个p</p> <span>span</span> <p> </p><p>这是子集菜单</p> <p>我是子集的p </p><p>我是子集的p</p> <button>点击加一</button> <script> let inner =33; $('#nodes').on('click','p,p,span',function(e){ let target = $(e.target) target.css('backgroundColor','red') }) $('button').click(()=>{ inner++; $('#nodes').append($('<p>我是新增加的p标签'+inner+'')) }) </script>
瀏覽器運作效果如圖五所示:
事件委託不只為處理一種dom操作類型,他可以進行增刪改查等功能:
js事件委託:不同操作
<p> <input> <input> </p> <p> </p> <script></script> <script> let events = document.getElementById('events'); let content = document.getElementById('content'); events.onclick=function(e){ let ev = e || window.event; let target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase()=='input'){ switch(target.id){ case 'addHandle': return addEvent(); break case 'deleteHandle': return deleteEvent(); break } } } function addEvent(){ let add = document.createElement('p') add.innerHTML = '这是增加按钮' content.appendChild(add) } function deleteEvent(){ let del = document.createElement('p') del.innerHTML = '这是删除按钮' content.appendChild(del) } </script>
瀏覽器中的效果如圖六所示:
jquery事件委託:不同操作
$('#events').on('click','input',(e)=>{ let target = $(e.target); switch(target[0].id){ case 'addHandle': return addEvent(); break case 'deleteHandle': return deleteEvent(); break } }) function addEvent(){ $('#content').append($('<p>这是增加按钮</p>')) } function deleteEvent(){ $('#content').append($('<p>这是删除按钮</p>')) }
瀏覽器中的效果如圖七所示:
本文如有不實之處,也望大神指點一二,歡迎討論!
推薦教學:《JS教學》
以上是javascript事件委託和jquery事件委託的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。