Javascript 简明教程

JavaScript - Event Capturing

Event Capturing

JavaScript 中的事件捕获是事件传播模型中的初始阶段,其中事件从文档树的根部向下传输到目标元素。在此阶段,浏览器捕获目标元素祖先处的事件,然后才能到达目标元素本身。

事件捕获和事件冒泡是 JavaScript 事件传播模型中的两个阶段。在事件捕获中,浏览器从文档层次的根部开始捕获和触发事件,并且向下传输到目标元素。另一方面,事件冒泡发生在事件到达目标元素之后,然后从目标向上冒泡到根部。

捕获对于在更高级别的祖先处处理事件很有用,而冒泡是事件从目标向上传播层次结构的默认行为。理解这两个阶段对于有效处理事件和操纵事件流非常重要。

让我们看看事件捕获的一些重要方面。

Aspect

Description

Phase

事件捕获是事件传播模型中的初始阶段。

Direction

捕获以元素层次结构的相反顺序发生,从文档树的根部向下传输到目标元素。

Use Case

当你想在事件到达目标元素或触发任何冒泡阶段处理程序之前,拦截并处理更高一级的祖先处的事件时,这会非常有用。

Registration

使用 addEventListener 的第三个参数(例如,element.addEventListener('click', myFunction, true);)注册捕获阶段的事件监听器。

Propagation

自动传播在目标和冒泡阶段之前发生。事件向下流动层次结构,在每个祖先处触发捕获阶段处理程序。

Preventing Default

在捕获阶段使用 event.preventDefault() 来阻止事件到达目标之前的默认行为。

Stopping Propagation

在捕获阶段使用 event.stopPropagation() 来阻止事件的进一步传播,防止其到达目标或触发冒泡阶段处理程序。

Example: Basic Event Capturing

在此示例中,我们在其中有一个容器 div (container) 和一个按钮 (myButton)。使用具有 true 参数的 addEventListener 添加了两个捕获阶段事件监听器以启用捕获。当你单击该按钮时,两个捕获阶段日志消息(已单击容器和已单击按钮)将会显示。这说明了捕获阶段,因为事件从文档根部向下传输到目标元素。

<!DOCTYPE html>
<html>
<body>
	<div id="container">
		<button id="myButton">Click me!</button>
	</div>
	<div id = "output"></div>
	<script>
		const output = document.getElementById('output');
		document.getElementById('container').addEventListener('click', function(event) {
			output.innerHTML += 'Capturing phase - Container clicked' + "<br>";
		}, true);

		document.getElementById('myButton').addEventListener('click', function(event) {
			output.innerHTML += 'Capturing phase - Button clicked' + "<br>";
		}, true);
	</script>
</body>
</html>

Example: Preventing Default Behaviour

在此示例中,我们有一个具有 id 为“link”的超链接 (<a>)。在捕获阶段,捕获阶段事件监听器附加到了该链接。当你单击该链接时,捕获阶段日志消息(已单击链接)将会显示,并且使用 event.preventDefault() 阻止了默认行为(导航到新页面)。

如果没有使用 .preventDefault(),它本会将页面导航到 [role="bare"] [role="bare"]https://www.tutorialspoint.com

<!DOCTYPE html>
<html>
<body>
	<a href="https://www.tutorialspoint.com" id="link">Click me to prevent default</a>
	<script>
		document.getElementById('link').addEventListener('click', function(event) {
			alert('Capturing phase - Link clicked');
			event.preventDefault(); // Prevent the default behavior (e.g., navigating to a new page)
		}, true);
	</script>
</body>
</html>

Example: Capturing and Stopping Propagation

在此示例中,父 div 的捕获阶段事件监听器使用 'event.stopPropagation()' 积极阻止了传播。仅当单击按钮时,你才会在捕获阶段期间看到一条日志消息(已单击父项),但是它不会触发子元素捕获阶段内的任何进一步操作。这的确展示了一种在此特定实例中阻止进一步传播的有效方法。

<!DOCTYPE html>
<html>
<body>
	<div id="parent">
		<button id="child">Click me!</button>
	</div>
	<div id = "output"></div>
	<script>
		const output = document.getElementById('output');
		document.getElementById('parent').addEventListener('click', function(event) {
			output.innerHTML += 'Capturing phase - Parent clicked' + "<br>";
			// Stop further propagation to the child element
			event.stopPropagation();
		}, true);
		document.getElementById('child').addEventListener('click', function(event) {
			output.innerHTML += 'Capturing phase - Child clicked' + "<br>";
		}, true);
	</script>
</body>
</html>