JS事件委托


    hello,沐晴,又來更新啦,今天呢就接着上篇博文講講冒泡帶給我們的一大優點,就是產生了所謂的事件委托,初聽事件委托,覺得有點高大上,了解過后發現它真是個非常有用的東西。OK,下面就跟我一起一探究竟把。。。

 先看看解析,事件委托:也稱事件代理 就是利用冒泡的原理 把加事件加到父級上,觸發執行效果

  首先呢,你一定寫過這樣的程序,有一個列表,當鼠標移入每個li,背景顏色變紅,於是我們寫出了這樣的代 碼:

(我給的代碼一般都寫的重點代碼,html大家可以自行寫哈。)

window.onload = function(){ 
    var oUl = document.getElementById('ull');
    var aLi = document.getElementsByTagName('li'); //獲取所有列
    for(var i =0;i < aLi.length;i++){ 
         aLi[i].onmouseover = function(){ 
this.style.background = "red";
} }

當然這樣一看代碼也沒什么問題,通過循環給每個li加事件,但想一想如果我們有很多個li,是不是要加很多次事件,這樣其實是非常耗性能的。那么我們會想,能不能只加一個事件就能實現呢。當然是能的,不然我就不會在這扯了。

     那就是通過冒泡原理進行事件委托,我們可以把事件只加給父級oUL,這樣不管移入哪個li,都會觸發父級的移入事件,(對冒泡不太理解的,可以參考我的JS冒泡的文章),但這個時候也有個問題,因為我的需求是,讓對應的li變顏色,不是讓整個列表變,它怎么知道我鼠標移入的是哪個LI,這個時候萬能的事件對象中的一個屬性就要出場了,就是事件源 (不管事件綁定在那個元素中 都指的是實際觸發事件的那個的目標),就是能獲取到你當前鼠標所在的LI,

不過這個有兼容性問題, IE和標准下不同,標准指的就是比較新版本的那些瀏覽器了

IE:window.event.srcElement
標准:event.target

所以需要做下兼容,也很簡單。

下面看下整體代碼:

window.onload = function(){ 
    var oUl = document.getElementById('ull');
     var aLi = document.getElementsByTagName('li');

  oUl.onmouseover = function(ev){ 
     var event = ev||window.event;  // 獲取event對象
     var target = ev.target || ev.srcElement; // 獲取觸發事件的目標對象
    
     if(target.nodeName.toLowerCase() == 'li'){  //判斷目標對象是不是li
         target.style.background = 'red';
     }

  }
代碼中加了一個標簽名的判斷,主要原因是如果不加判斷,當你鼠標移入到父級oUL上面的時候,整個列表就會變紅,這不是我們想要的結果,所以要判斷一下。
target.nodeName 彈出的名字是大寫的,所以需要轉換大小寫再比較。
 
        

 

整個需求這樣就完成了,而且當列表很多的時候大大的提高了性能。

其實事件委托還有第二個優點:就是新添加的元素還會有之前的事件

假定我們又有一個需求,點擊某個按鈕,可以在列表中再創建一個li,這個時候一般方法,因為新創建的li沒有加事件,所以是不具備移入變紅的功能的,但是用事件委托的方法,新的li,同樣有這個事件。原理也很容易相同,因為事件是加在父親上面的,父親在,事件在,大家可以自己測試一下。

 

好了,這就是我所理解的事件委托了,如有錯誤,歡迎指正,討論,我是沐晴,不見不散。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM