avatar

事件委托代理

事件委托是什么

事件:通俗的讲, 就是onclick, onmouseenter, onmouseover, onmouseout… 等等

委托:通俗的讲, 就是让别人来做

那么事件委托就是:这个事件本来是加在某些元素上的, 然而你却加到别人身上来做, 来完成这个事件, 也就是利用冒泡原理, 把事件加到父级上, 触发执行结果

事件委托就是利用事件冒泡机制指定一个事件处理程序,来管理某一类型的所有事件。

事件委托的好处

  1. 提高性能(只在内存中开辟了一块空间,节省资源同时减少了dom操作)
  2. 新添加的元素还会有之前的事件

我们来看一个例子: 需要触发每个 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");

/*
这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
ie:window.event.srcElement
标准下:event.target
nodeName:找到元素的标签名
*/
oUl.onmouseover = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
//alert(target.innerHTML);
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "red";
}
}
oUl.onmouseout = function(ev){
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
//alert(target.innerHTML);
if(target.nodeName.toLowerCase() == "li"){
target.style.background = "";
}
}
}
文章作者: Kwin
文章链接: http://huangkun.host/2020/03/25/20190922-事件委托代理/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kwin 's Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论