事件委托是什么
事件:通俗的讲, 就是onclick, onmouseenter, onmouseover, onmouseout… 等等
委托:通俗的讲, 就是让别人来做
那么事件委托就是:这个事件本来是加在某些元素上的, 然而你却加到别人身上来做, 来完成这个事件, 也就是利用冒泡原理, 把事件加到父级上, 触发执行结果
事件委托就是利用事件冒泡机制指定一个事件处理程序,来管理某一类型的所有事件。
事件委托的好处
- 提高性能(只在内存中开辟了一块空间,节省资源同时减少了dom操作)
- 新添加的元素还会有之前的事件
我们来看一个例子: 需要触发每个 li 来改变他们的背景颜色
1 2 3 4 5
| <ul id="ul"> <li>111</li> <li>222</li> <li>333</li> </ul>
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li");
for(var i=0; i<aLi.length; i++){ aLi[i].onmouseover = function(){ this.style.background = "red"; } aLi[i].onmouseout = function(){ this.style.background = ""; } } }
|
这样我们就可以做到li上面添加鼠标事件。
但是如果说我们可能有很多个li用for循环的话就比较影响性能。
下面我们可以用事件委托的方式来实现这样的效果。html不变
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
| window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li");
oUl.onmouseover = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase() == "li"){ target.style.background = "red"; } } oUl.onmouseout = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase() == "li"){ target.style.background = ""; } } }
|