首頁 >web前端 >js教程 >js事件委託是什麼?使用js事件委託的好處有哪些?

js事件委託是什麼?使用js事件委託的好處有哪些?

不言
不言原創
2018-08-29 17:37:256016瀏覽

js事件委託是什麼?使用事件委託又有哪些好處? 相信很多的朋友或許會有這樣的疑問,那麼,接下來的這篇文章就給大家來說一說關於js事件委託的概念以及使用js事件委託的好處。

1、什麼是js事件委託?

利用事件冒泡處理動態元素事件綁定的方法,專業術語叫事件委託,簡單點來說就是給父元素綁定事件,用來監聽子元素的冒泡事件,並找到是哪個子元素的事件,更加通俗一點那就是讓別人來做,這個事件本來是加在某些元素上的,然而你卻加到別人身上來做,完成這個事件。 (事件有哪些?請看:JavaScript中文參考手冊

例如下面這個範例:原生js實作事件委託

<!DOCTYPE html>
<html>
<head>
<title>事件委托测试</title>
</head>
<body>
<style type="text/css">
*{margin: 0;padding: 0;}
a{text-decoration: none;}
ul,li{list-style: none;}
div{display: block;width: 500px;padding: 200px 0 0 200px;}
div ul li{display: block;width: 100%;text-align: center;height: 35px;line-height: 35px;}
div ul li:nth-child(2n){background: #f00;}
</style>
<div>
    <ul>
        <li><a>测试1</a></li>
        <li><a>测试2</a></li>
        <li><a>测试3</a></li>
        <li><a>测试4</a></li>
        <li><a>测试5</a></li>
        <li><a>测试6</a></li>
        <li><a>测试7</a></li>
        <li><a>测试8</a></li>
    </ul>
</div>
<script type="text/javascript">
document.getElementsByTagName("ul")[0].addEventListener(&#39;click&#39;,function(e){
    alert("点击的内容是:"+e.target.innerHTML);
});
</script>
</body>
</html>

注意: js實作事件委託有三個步驟:

第一步:給父元素綁定事件
給元素ul新增綁定事件,透過addEventListener為點擊事件click新增綁定

第二步:監聽子元素的冒泡事件
這裡預設是冒泡,點選子元素li會向上冒泡

#第三步:找到是哪個子元素的事件

透過匿名回呼函數的參數e用來接收事件對象,透過target取得觸發事件的目標

2、js事件委託的好處:

事件委託的好處1:事件委託技術可以避免對每個字元素添加事件監聽器,減少操作DOM節點的次數,從而減少瀏覽器的重繪和重排,提高程式碼的效能。

我們可以看一個例子:我們要做動態的新增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);
  }
}

事件委託的好處2:使用事件委託,只有父元素與DOM存在交互,其他的操作都是在JS虛擬記憶體中完成的,這樣就大大提高了性能。

相關推薦:

js中的事件委託

#javascript事件委託和jQuery事件綁定on、off 和one

以上是js事件委託是什麼?使用js事件委託的好處有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn