JavaScript 事件委托就是利用 JavaScript 事件冒泡的特性,将内层元素的事件委托(绑定)给外层元素处理。
通俗的讲,事件委托就是把一个元素响应事件(click、keydown…)的函数委托到另一个元素上。
简单的讲,事件委托就是利用 JavaScript 事件冒泡的特性,将内层元素的事件委托(绑定)给外层元素处理。
一般来讲,事件委托会把一个或者一组元素的事件委托(绑定)到它的父层元素或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 <html > <head > <title > 普通写法(不使用事件委托)</title > </head > <body > <ul > <li > li 1 号</li > <li > li 2 号</li > <li > li 3 号</li > <li > li 4 号</li > </ul > <button id ="btn" > 添加</button > <script > let oUl = document .getElementsByTagName("ul" )[0 ];let oLi = document .getElementsByTagName("li" );for (let i = 0 ; i < oLi.length; i++) { oLi[i].onclick = function () { console .log(oLi[i].innerText); }; }; let btn = document .getElementById("btn" );btn.onclick = function () { let aLi = document .createElement("li" ); aLi.innerHTML = `li ${oLi.length+1 } 号` ; aLi.onclick = function () { console .log(aLi.innerText); }; oUl.appendChild(aLi); }; </script > </body > </html > 分析: 从上面的代码可以看到,用 for 循环给相应的 li 添加点击事件,每添加一个就多一次 dom 操作,加上按钮点击总共 5 次。当添加新的 li 元素时,还要给新 li 元素添加点击事件,这无疑有些繁琐,而且 dom 操作的次数没有做优化,显然当页面的 li 元素很多的时候,性能将会受到影响。 ———————————————— 版权声明:本文为CSDN博主「web晨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_51157081/article/details/115823928
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 <html > <head > <title > 事件委托写法</title > </head > <body > <ul > <li > li 1 号</li > <li > li 2 号</li > <li > li 3 号</li > <li > li 4 号</li > </ul > <button id ="btn" > 添加</button > <script > let oUl = document .getElementsByTagName("ul" )[0 ];let oLi = document .getElementsByTagName("li" );oUl.onclick = function (ev) { ev = ev || window .event; let target = ev.target || ev.srcElement; if (target.nodeName.toLowerCase() == "li" ) { console .log(target.innerText); }; console .log(target.innerText); }; let btn = document .getElementById("btn" );btn.onclick = function (ev) { let aLi = document .createElement("li" ); aLi.innerHTML = `li ${oLi.length+1 } 号` ; oUl.appendChild(aLi); }; </script > </body > </html > 分析: 将上面的代码和普通写法进行比对,显然用事件委托的写法更加的简洁,不仅能减少代码量,同时还能减少 dom 操作次数,实现对性能的优化,简直一举多得。