JavaScript事件的委托(代理)的用法示例詳解
簡介
說明
本文用示例介紹JavaScript中的事件(Event)的委托(代理)的用法。
事件委托簡介
事件委托,也叫事件代理,是JavaScript中綁定事件的一種常用技巧。就是將原本需要綁定在子元素的響應(yīng)事件委托給父元素或更外層元素,讓外層元素?fù)?dān)當(dāng)事件監(jiān)聽的職務(wù)。
事件代理的原理是DOM元素的事件冒泡。
事件委托的優(yōu)點(diǎn)
1.節(jié)省內(nèi)存,減少事件的綁定
原本需要綁定在所有子元素的事件,使用事件委托之后,只需要一個(gè)事件綁定即可。
2.可以動(dòng)態(tài)綁定事件,新增的子對象事件可以被已綁定的事件處理
因?yàn)樾略龅淖訉ο螽a(chǎn)生的事件,最終也會(huì)冒泡到父元素,從而能夠處理
示例:事件委托
需求:一個(gè)列表,點(diǎn)擊列表元素時(shí)彈出其內(nèi)容。
寫法1:事件委托
只需在外層元素綁定事件即可。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>This is title</title>
</head>
<body>
<ul id="id-ul">
<li>我是第1個(gè)li</li>
<li>我是第2個(gè)li</li>
<li>我是第3個(gè)li</li>
</ul>
<script>
let ul = document.getElementById('id-ul');
ul.addEventListener("click", function (ev) {
alert(ev.target.innerText);
})
</script>
</body>
</html>結(jié)果

寫法2:每個(gè)子元素都綁定事件
每個(gè)子元素都綁定事件。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>This is title</title>
</head>
<body>
<ul id="id-ul">
<li>我是第1個(gè)li</li>
<li>我是第2個(gè)li</li>
<li>我是第3個(gè)li</li>
</ul>
<script>
let li = document.querySelectorAll('#id-ul li');
for (let liElement of li) {
liElement.addEventListener("click", function (ev) {
alert(ev.target.innerText);
});
}
</script>
</body>
</html>結(jié)果

示例:新增元素
需求:每點(diǎn)擊“生成按鈕”,就生成一個(gè)子的列表元素。然后,每點(diǎn)擊一次列表元素,會(huì)彈出其內(nèi)容。
寫法1:事件委托
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>This is title</title>
</head>
<body>
<ul id="id-ul">
<li>1</li>
<li>2</li>
</ul>
<button id="btn">click</button>
<script>
let num = 3;
let eUl = document.querySelector("#id-ul");
let eButton = document.querySelector("#btn");
eButton.addEventListener("click", function () {
let newLi = document.createElement("li");
eUl.appendChild(newLi);
newLi.innerText = num++;
})
eUl.addEventListener("click",function (event) {
alert(event.target.innerText);
})
</script>
</body>
</html>結(jié)果

可以看到,原有的元素和新建的元素的事件都會(huì)被處理。
寫法2:每個(gè)子元素都綁定事件
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>This is title</title>
</head>
<body>
<ul id="id-ul">
<li>1</li>
<li>2</li>
</ul>
<button id="btn">click</button>
<script>
let num = 3;
let eUl = document.querySelector("#id-ul");
let eButton = document.querySelector("#btn");
let eLi = document.querySelectorAll("#id-ul li");
eButton.addEventListener("click", function () {
let newLi = document.createElement("li");
eUl.appendChild(newLi);
newLi.innerText = num++;
})
for (let eLiElement of eLi) {
eLiElement.addEventListener("click",function (event) {
alert(event.target.innerText);
})
}
</script>
</body>
</html>結(jié)果

可以看到:原有的元素的點(diǎn)擊事件會(huì)被處理,但新加入的不會(huì)被處理。
到此這篇關(guān)于JavaScript事件的委托(代理)的用法示例詳解的文章就介紹到這了,更多相關(guān)JavaScript事件委托內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果
這篇文章主要介紹了微信小程序開發(fā)之a(chǎn)nimation循環(huán)動(dòng)畫實(shí)現(xiàn)的讓云朵飄效果,結(jié)合實(shí)例形式分析了animation結(jié)合js時(shí)間函數(shù)實(shí)現(xiàn)循環(huán)動(dòng)畫效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
JS實(shí)現(xiàn)兼容各瀏覽器解析XML文檔數(shù)據(jù)的方法
這篇文章主要介紹了JS實(shí)現(xiàn)兼容各瀏覽器解析XML文檔數(shù)據(jù)的方法,涉及javascript對XML文件的解析技巧,并根據(jù)各瀏覽器進(jìn)行了相關(guān)調(diào)整,具有良好的兼容性,需要的朋友可以參考下2015-06-06
Uniapp中嵌入H5并在H5中跳轉(zhuǎn)到APP的指定頁面方法詳解
Uniapp是一款基于Vue.js框架的跨平臺(tái)開發(fā)工具,支持在一套代碼中開發(fā)出運(yùn)行于各大平臺(tái)的應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于Uniapp中嵌入H5并在H5中跳轉(zhuǎn)到APP的指定頁面的相關(guān)資料,需要的朋友可以參考下2023-09-09
javascript 流暢動(dòng)畫實(shí)現(xiàn)原理
瀏覽器目前來說是沒有抗鋸齒效果的(將來不一定哦),這樣dom元素外觀的改變就被限制在1個(gè)像素為最佳效果。2009-09-09
Parcel.js + Vue 2.x 極速零配置打包體驗(yàn)教程
這篇文章主要介紹了Parcel.js + Vue 2.x 極速零配置打包體驗(yàn) 的相關(guān)資料,需要的朋友可以參考下2017-12-12
深入淺出webpack教程系列_安裝與基本打包用法和命令參數(shù)詳解
下面小編就為大家?guī)硪黄钊霚\出webpack教程系列_安裝與基本打包用法和命令參數(shù)詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就想給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09

