3

事件委托(代理)

 3 years ago
source link: https://blog.csdn.net/weixin_51157081/article/details/115823928
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

定义(多种不同的定义)

  1. 通俗的讲,事件委托就是把一个元素响应事件(click、keydown…)的函数委托到另一个元素上。
  2. 简单的讲,事件委托就是利用 JavaScript 事件冒泡的特性,将内层元素的事件委托(绑定)给外层元素处理。
  3. 一般来讲,事件委托会把一个或者一组元素的事件委托(绑定)到它的父层元素或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。

1、普通写法(不使用事件委托)

<ul>
	<li>li 1 号</li>
	<li>li 2 号</li>
	<li>li 3 号</li>
	<li>li 4 号</li>
</ul>

<button id="btn">添加</button>
// 通过标签名获取元素
let oUl = document.getElementsByTagName("ul")[0];
let oLi = document.getElementsByTagName("li");

// 遍历元素给每个元素添加点击事件
for (let i = 0; i < oLi.length; i++) {
	oLi[i].onclick = function() {
		console.log(oLi[i].innerText);
	};
};

// 通过 id 获取 按钮元素
let btn = document.getElementById("btn");

// 给按钮添加点击事件
btn.onclick = function() {
	// 创建新的 li
	let aLi = document.createElement("li");

	// 给 li 赋值
	aLi.innerHTML = `li ${oLi.length+1} 号`;

	// 为新节点单独添加事件
	aLi.onclick = function() {
		console.log(aLi.innerText);
	};

	// 把 li 展示到页面上
	oUl.appendChild(aLi);
};

从上面的代码可以看到,用 for 循环给相应的 li 添加点击事件,每添加一个就多一次 dom 操作,加上按钮点击总共 5 次。当添加新的 li 元素时,还要给新 li 元素添加点击事件,这无疑有些繁琐,而且 dom 操作的次数没有做优化,显然当页面的 li 元素很多的时候,性能将会受到影响。

2、事件委托写法

<ul>
	<li>li 1 号</li>
	<li>li 2 号</li>
	<li>li 3 号</li>
	<li>li 4 号</li>
</ul>

<button id="btn">添加</button>
// 通过标签名获取元素
let oUl = document.getElementsByTagName("ul")[0];
let oLi = document.getElementsByTagName("li");

// 直接给 ul 添加点击事件
oUl.onclick = function(ev) {
	// ev 对象的兼容处理
	ev = ev || window.event;

	// 通过 ev 对象的 target 找到触发事件的元素    
	// 此操作的作用是:拿到对应的元素
	let target = ev.target || ev.srcElement;

	// 需求中的操作
	// target.nodeName.toLowerCase() 获取元素的操作
	// 写法一
	if (target.nodeName.toLowerCase() == "li") {
		console.log(target.innerText);
	};

	// 写法二
	console.log(target.innerText);
};

// 通过 id 获取 按钮元素
let btn = document.getElementById("btn");

// 为按钮添加点击事件
btn.onclick = function(ev) {
	// 新建 li 元素
	let aLi = document.createElement("li");

	// 给 li 赋值
	aLi.innerHTML = `li ${oLi.length+1} 号`;

	// 直接将新 li 元素放到 ul 上
	oUl.appendChild(aLi);
};

将上面的代码和普通写法进行比对,显然用事件委托的写法更加的简洁,不仅能减少代码量,同时还能减少 dom 操作次数,实现对性能的优化,简直一举多得。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK