Javascript 事件委托

1,什么是事件委托:通俗的講,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是讓別人來做,這個事件本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件。

也就是:利用冒泡的原理,把事件加到父級上,觸發執行效果。

好處呢:1,提高性能。

我們可以看一個例子:需要觸發每個li來改變他們的背景顏色。

<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上面添加鼠標事件。

但是如果說我們可能有很多個li用for循環的話就比較影響性能。

下面我們可以用事件委托的方式來實現這樣的效果。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,新添加的元素還會有之前的事件。

我們還拿這個例子看,但是我們要做動態的添加li。點擊button動態添加li

如:

<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);
    }
}
 

原文地址
http://itindex.net/detail/48661-js-%E4%BA%8B%E4%BB%B6?utm_source=tuicool&utm_medium=referral
如同在我們用微博中,新發微博照樣有之前的鼠標事件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 事件委托: 就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。原理(借鑒):事件委托是利用事...
    尤樊容閱讀 134評論 0 1
  • 15.1 問題 假如我們要對li的點擊事件進行處理,通常情況下我們會這么寫: 但是這里li有1000個,每個li都...
    農場主的雞閱讀 328評論 0 0
  • 1. 事件委托 事件處理程序過多的解決方法就是事件委托,事件委托利用的是事件冒泡。事件冒泡:事件由最具體的元素接收...
    LYF閑閑閑閑閱讀 430評論 0 2
  • 今天沒有體重,因為昨天我在單位通宵值班。真的沒有睡好,因為開著燈,也因為害怕。尼瑪,整棟樓就幾個人,你說慌不慌。就...
    花花世界草草人生閱讀 266評論 1 1
  • 21個你必須避開的溝通風暴 沒有搞不定的溝通問題,高情商社交的自我養成計劃,21個正面溝通經驗,祝你締造積極影響力...
    打不敗的小閆閆閱讀 1,015評論 2 4