前端祖传三件套JavaScript的DOM之事件的冒泡/捕获

简介: 在前端开发中,事件处理是非常重要的一部分。JavaScript 中的 DOM 事件机制提供了丰富的功能和灵活的方式来处理各种事件,并且事件的传播方式也是其中不可或缺的一部分。本文将介绍 JavaScript 中的事件传播方式:冒泡和捕获。


一、事件冒泡

在事件冒泡模式中,事件首先在目标元素上触发,然后逐级向上传播到包含该元素的父级元素,直到到达最外层的祖先元素。在事件冒泡过程中,每个包容元素的处理函数都会执行,如果有多个相同类型的事件处理函数,它们会按照绑定的先后顺序依次执行。

以下是一个简单的示例:

<div id="outer">
    <div id="inner">Click me!</div>
</div>
<script>
var outer = document.getElementById('outer');
var inner = document.getElementById('inner');
outer.addEventListener('click', function(event) {
    console.log('Clicked on outer element');
});
inner.addEventListener('click', function(event) {
    console.log('Clicked on inner element');
});
</script>

在上述代码中,当点击 inner 元素时,事件会首先在 inner 元素上触发,然后冒泡到 outer 元素,最终到达文档的根元素。

二、事件捕获

在事件捕获模式中,事件从最外层的祖先元素开始逐级向下传播,直到到达目标元素。在事件捕获过程中,每个包容元素的处理函数都会执行,如果有多个相同类型的事件处理函数,它们会按照绑定的先后顺序依次执行。

以下是一个简单的示例:

<div id="outer">
    <div id="inner">Click me!</div>
</div>
<script>
var outer = document.getElementById('outer');
var inner = document.getElementById('inner');
outer.addEventListener('click', function(event) {
    console.log('Clicked on outer element (capture)');
}, true);
inner.addEventListener('click', function(event) {
    console.log('Clicked on inner element (capture)');
}, true);
</script>

在上述代码中,当点击 inner 元素时,事件从 outer 元素开始向下传播,在捕获阶段依次触发 outer 和 inner 元素的事件处理函数,最终到达目标元素 inner。

三、事件传播的应用

在实际开发中,我们可以利用事件冒泡和捕获的特性来实现一些常见的任务。

例如,在使用表格布局时,我们可能需要根据用户的操作来调整表格列宽。可以通过在表格父元素上绑定 mousemove 事件来实现:

<table>
    <thead>
        <tr>
            <th>Column 1</th>
            <th>Column 2</th>
            <th>Column 3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Content 1-1</td>
            <td>Content 1-2</td>
            <td>Content 1-3</td>
        </tr>
        <tr>
            <td>Content 2-1</td>
            <td>Content 2-2</td>
            <td>Content 2-3</td>
        </tr>
    </tbody>
</table>
<script>
var table = document.querySelector('table');
var resizing = false;
var column = null;
var startX = null;
table.addEventListener('mousedown', function(event) {
    if (event.target.tagName === 'TH') {
        resizing = true;
        column = event.target;
        startX = event.pageX;
    }
}, true);
table.addEventListener('mousemove', function(event) {
    if (resizing) {
        var deltaX = event.pageX - startX;
        var width = parseInt(column.style.width || column.clientWidth);
        column.style.width = (width + deltaX) + 'px';
        startX = event.pageX;
    }
}, true);
table.addEventListener('mouseup
目录
相关文章
|
11天前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
|
5天前
|
JavaScript 前端开发 开发者
javascript事件大全
javascript事件大全
10 1
|
5天前
|
JavaScript 前端开发 安全
javascript操作DOM的方法
javascript操作DOM的方法
11 0
|
5天前
|
JavaScript 前端开发
Javascript的一些监听事件
Javascript的一些监听事件
11 2
|
5天前
|
JavaScript 前端开发
js的事件介绍
js的事件介绍
11 1
|
5天前
|
JavaScript 前端开发
js的事件
js的事件
10 1
|
5天前
|
JavaScript 前端开发
js的交互事件
js的交互事件
12 1
|
9天前
|
JavaScript 前端开发 UED
【Web 前端】如何将一个 HTML 元素添加到 DOM 树中的?
【5月更文挑战第2天】【Web 前端】如何将一个 HTML 元素添加到 DOM 树中的?
|
9天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
11天前
|
JavaScript 前端开发 开发者
【JavaScript技术专栏】JavaScript事件处理机制详解
【4月更文挑战第30天】本文探讨JavaScript中的事件处理机制,涉及事件类型(如click、mouseover)、事件流(冒泡型、捕获型及目标阶段)、事件处理函数(内联与addEventListener方法)以及事件委托(用于优化内存和处理动态元素)。此外,还介绍了事件取消,通过`preventDefault()`和`stopPropagation()`控制事件行为。理解这些概念对构建交互式Web应用至关重要。