原理

如果页面上有 10 个 li 元素,点击谁,谁就变色。我们之前学习过使用循环语句给它们添加监听,但是这

样做会使系统的内存开销非常大,网页的性能会急剧下降,因为我们创建了非常多的事件监听。

那应该怎么办呢?事件委托就是一非常好的解决办法。

事件委托指的是将事件委托给父元素或者组件元素,父元素或者祖先元素利用事件冒泡机制会响应事件,通

过 event.target 来判断是谁触发了事件。

例如:

<!DOCTYPE html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

<title>事件委托</title>

<style type="text/css">

ul{

list-style: none;

}

li{

float: left;

width: 60px;

height: 60px;

background-color: #ccc;

margin-right: 10px;

}

</style>

</head>

<body>

<ul>

<li></li>

<li></li>

<li></li>

<li></li>

<li></li>

<li></li>

<li></li>

<li></li>

</ul>

<script type="text/javascript">

var ul = document.querySelector("ul");

//事件委托

ul.onclick = function(event){

event.target.style.backgroundColor = "red";

}

</script>

</body>

</html>

代码非常的简单,我们只监听了 ul 对象的点击事件,点击之后让 event.target 元素即事件的来源(就是

li 元素)的背景颜色设置为红色。这就完成了点击谁谁变色的效果

这就是事件委托,非常的简单,是利用事件冒泡和 event.target 属性实现的。

什么时候需要事件委托

需要使用事件委托委托的场景:

 页面上有大量相似元素需要添加监听

 页面上有动态元素需要添加监听

页面上有大量相似元素需要添加监听”可以理解,但是“页面上有动态元素需要添加监听”是什么意思呢?

我们在上一章学习过创建元素的方法,新创建的元素是没有任何事件监听的。我们总不能创建一个元素,就

给它添加一个监听吧?

所以,当页面上有动态元素需要添加监听的时候,要想起事件委托。比如:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<style type="text/css">

ul{

list-style: none;

}

li{

float: left;

width: 80px;

height:80px;

margin-right: 10px;

background-color: orange;

}

</style>

</head>

<body>

<button id="btn">添加 li 元素</button>

<ul id="myList"></ul>

<script type="text/javascript">

var myList = document.getElementById("myList");

var btn = document.getElementById("btn");

//事件委托

myList.onclick = function(event){

event.target.style.background = "red";

}

//点击按钮创建新 li 上树

btn.onclick = function(){

var nLi = document.createElement("li");

myList.appendChild(nLi);

}

</script>

</body>

</html>

在页面上我们放了一个按钮,点击按钮之后将会创建一个列表项添加到列表中。添加到列表中的元素会天生

拥有事件,因为我们使用了事件委托。