JS中的事件委託
什麼是事件委託:
通俗的講,事件就是onclick,onmouseover,onmouseout,等就是事件,委託的呢就是讓別人來做,這個時間本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件。
原理:
利用冒泡的原理,把事件加到父級上,觸發執行效果。
優點:
1. 提高效能。
例如:需要觸發每個li來改變他們的背景顏色。
<ul id = "ul"> <li>aaaa</li> <li>aaaa</li> <li>aaaa</li> </ul>
window.onload = function(){ //獲取到ul var oUl = document.getElementById('ul'); //獲取到所有的li var aLi = oUl.getElementsByTagName('li'); //遍歷li for(var i = 0;i < aLi.length;i ++){ //給所移入的li新增事件 aLi[i].onmouseover = function(){ this.style.background = 'red'; } //新增移出事件 aLi[i].onmouseout = function(){ this.style.background = ''; } } }
這樣就可以做到li上面新增滑鼠事件。
但是如果說我們可能有很多個li用for迴圈的話就比較 影響效能
下面我們可以用事件委託的方式來實現這樣的效果。(html不變)
/* 利用事件委託實現 */ window.onload = function(){ //獲取到ul var oUl = document.getElementById('ul'); //獲取到所有的li var aLi = oUl.getElementsByTagName('li'); /* 這裡要用到事件源:event物件,事件源,不管在那個事件中,只要你操作的那個元素就是事件源。 相容: IE:window.event.srcElement 標準下:event.target nodeName:找到元素的標籤名 */ oUl.onmouseover = function(e){ var e = e || window.event;//相容 var target = e.target || e.srcElement; //alert(target.innerHtml);//undefined //將大寫改為小寫 事件源中英文都是大寫 if(target.nodeName.toLowerCase() == 'li'){ target.style.background = 'red'; } } oUl.onmouseout = function(e){ var e = e || window.event;//相容 var target = e.target || e.srcElement; //alert(target.innerHtml);//undefined //將大寫改為小寫 事件源中英文都是大寫 if(target.nodeName.toLowerCase() == 'li'){ target.style.background = ''; } } }
優點:
2. 新新增的元素還會有之前的事件。
還拿這個例子來看,但是我們要做動態的新增li。點選button動態新增li
例如:
/* 不使用事件委託點選button動態新增li,新新增的li沒有滑鼠移入事件。 */ 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迴圈已經執行完畢
那麼我們就要用事件委託的方式來做
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); } }