JS中的事件代理

1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来作,这个事件原本是加在某些元素上的,然而你却加到别人身上来作,完成这个事件。javascript

也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。html

好处呢:1,提升性能。java

咱们能够看一个例子:须要触发每一个li来改变他们的背景颜色。node

复制代码
<ul id="ul">
  <li>aaaaaaaa</li>
  <li>bbbbbbbb</li>
  <li>cccccccc</li>
</ul>
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上面添加鼠标事件。app

可是若是说咱们可能有不少个li用for循环的话就比较影响性能。post

下面咱们能够用事件委托的方式来实现这样的效果。html不变性能

复制代码
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 = ""; } } }
复制代码

好处2,新添加的元素还会有以前的事件。this

咱们还拿这个例子看,可是咱们要作动态的添加li。点击button动态添加lispa

如:code

复制代码
<input type="button" id="btn" /> <ul id="ul"> <li>aaaaaaaa</li> <li>bbbbbbbb</li> <li>cccccccc</li> </ul>
复制代码

 不用事件委托咱们会这样作:

复制代码
window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li"); var oBtn = document.getElementById("btn"); var iNow = 4; for(var i=0; i<aLi.length; i++){ aLi[i].onmouseover = function(){ this.style.background = "red"; } aLi[i].onmouseout = function(){ this.style.background = ""; } } oBtn.onclick = function(){ iNow ++; var oLi = document.createElement("li"); oLi.innerHTML = 1111 *iNow; oUl.appendChild(oLi); } }
复制代码

 这样作咱们能够看到点击按钮新加的li上面没有鼠标移入事件来改变他们的背景颜色。

由于点击添加的时候for循环已经执行完毕。

那么咱们用事件委托的方式来作。就是html不变

复制代码
window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li"); var oBtn = document.getElementById("btn"); var iNow = 4; 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 = ""; } } oBtn.onclick = function(){ iNow ++; var oLi = document.createElement("li"); oLi.innerHTML = 1111 *iNow; oUl.appendChild(oLi); } }
复制代码

ok:

如同在咱们用微博中,新发微博照样有以前的鼠标事件。

相关文章
相关标签/搜索