事件委托、事件冒泡

事件委托

不在事件的发生地(直接dom)上设置监听函数,而是在其父元素上设置监听函数,通过事件冒泡,父元素可以监听到子元素上事件的触发,通过判断事件发生元素dom的类型,来做出不同的响应。事件委托发生在冒泡阶段。

例子:
比如说在ul上绑定事件,依然可以通过e.target获得li的内容

<body>
    <ul>
        <li>评估</li>
        <li>几点</li>
        <li>得分</li>
    </ul>
</body>
<script>
    let ul = document.querySelector('ul')
    ul.onclick = function(e) {
        ul.removeChild(e.target);
        console.log(e.target)
    }
</script>

在这里插入图片描述
优点:

  • 新添加的子元素也会有监听函数,也可以有事件触发机制。
  • 减少内存消耗,节约效率

事件冒泡

  1. 如果在父元素上设置了事件监听机制,当点击第一个p标签时,会在p1上查找是否有事件处理函数。
  2. 如果没有,就向父元素上查找是否有事件处理函数。
  3. 如果有,就是自身的事件被触发后,再向父元素查找是否有相同类型的事件,如果有,就出发。
  4. 父元素的相同事件也会一级一级的向外触发,直到document/window,冒泡过程结束。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title></title>
		<!-- <script type="text/javascript">
			var a = document.getElementById('container').innerText
			console.log("head中:", a)
		</script> -->
	</head>
	<body>
		<div id="list1">
			<p id="p1">取消</p>
			<p id="p1">取消</p>
			<p id="p1">取消</p>
		</div>
		
		<div id="list2">
			<p id="p4">取消</p>
			<p id="p5">确定</p>
		</div>
		
		<script type="text/javascript">
		// 定义一个绑定事件的函数
			function bindEvent(elem, type, fn) {
				// elem:要绑定的对象
				// type:绑定的类型,例:click
				// fn:事件处理函数
				elem.addEventListener(type, fn);
			}
			// 仅绑定p1
			const p1 = document.getElementById('p1');
			bindEvent(p1, 'click', function (event) {
				// 阻止冒泡
				event.stopPropagation();
				console.log('click')
			})
			
			// 父元素设置事件监听
			const list1 = document.getElementById('list1');
			bindEvent(list1, 'click', function () {
				console.log('clicklist')
			})
		</script>
	</body>
</html>

知识点: 阻止冒泡 event.stopPropagation();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值