美文网首页深究JavaScript
说说 JavaScript 中的冒泡与捕获过程

说说 JavaScript 中的冒泡与捕获过程

作者: deniro | 来源:发表于2020-05-31 16:07 被阅读0次

W3C 规范中定义了3个事件阶段,依次是捕获阶段 、 目标阶段 、 冒泡阶段。先捕获,后冒泡,捕获从上到下,就像石沉大海;而冒泡从下到上就像气泡冒出水面。

先看个示例:

html 页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>冒泡与捕获</title>

</head>
<body style="border: blueviolet 3px solid">
<table style="border: saddlebrown 3px solid">
    <tbody>
    <tr>
        <td>美杉</td>
        <td>禄铭</td>
    </tr>
    <tr id="secondTr">
        <td id="firstTd" style="border: olivedrab 3px solid">彦芸</td>
        <td>阳骞</td>
    </tr>
    </tbody>
</table>
<script type="text/javascript" src="captureAndBubble2.js"></script>
</body>
</html>

js :

/*
 * 冒泡与捕获
 * @author Deniro Lee
 */

let html = document.documentElement;
let body = document.body;
let table = body.querySelector('table');
let tbody = body.querySelector('tbody');
let secondTr = body.querySelector('#secondTr');
let firstTd = body.querySelector('#firstTd');

/**
 * 冒泡回调
 * @param event
 */
function bubbleCallback(event) {
    let target = event.currentTarget;
    console.log('bubble -> ' + target.tagName);
}

/**
 * 捕获回调
 * @param event
 */
function captureCallback(event) {
    let target = event.currentTarget;
    console.log('capture -> ' + target.tagName);
}



html.addEventListener('click', captureCallback, true);
body.addEventListener('click', captureCallback, true);
table.addEventListener('click', captureCallback, true);
tbody.addEventListener('click', captureCallback, true);
secondTr.addEventListener('click', captureCallback, true);
firstTd.addEventListener('click', captureCallback, true);

html.addEventListener('click', bubbleCallback, false);
body.addEventListener('click', bubbleCallback, false);
table.addEventListener('click', bubbleCallback, false);
tbody.addEventListener('click', bubbleCallback, false);
secondTr.addEventListener('click', bubbleCallback, false);
firstTd.addEventListener('click', bubbleCallback, false);

在浏览器中运行以上页面,点击“彦芸”后,在 Console 中会看到冒泡与捕获的过程运行结果:

点击事件对象会按照图 1 的传播路径依次完成捕获、目标与冒泡阶段。如果某个阶段不支持或事件对象的传播被终止,那么该阶段就会被跳过。

代码中使用了addEventListener() 方法来跟踪捕获与冒泡阶段事件。该方法的语法为:

element.addEventListener(event, function, useCapture)
参数 描述
event 必须。字符串,指定事件名。注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。
function 必须。指定要事件触发时执行的函数。 当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。
useCapture 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。可能值: true - 事件句柄会在捕获阶段执行; false- 默认值,事件句柄会在冒泡阶段执行。

之前定义的脚本,我们使用 addEventListener() 方法先绑定捕获方法,后绑定冒泡方法;如果我们交换下顺序,先绑定冒泡然后再捕获会怎样?

html.addEventListener('click', bubbleCallback, false);
body.addEventListener('click', bubbleCallback, false);
table.addEventListener('click', bubbleCallback, false);
tbody.addEventListener('click', bubbleCallback, false);
secondTr.addEventListener('click', bubbleCallback, false);
firstTd.addEventListener('click', bubbleCallback, false);

html.addEventListener('click', captureCallback, true);
body.addEventListener('click', captureCallback, true);
table.addEventListener('click', captureCallback, true);
tbody.addEventListener('click', captureCallback, true);
secondTr.addEventListener('click', captureCallback, true);
firstTd.addEventListener('click', captureCallback, true);

运行结果:

可以发现目标元素的冒泡事件先于捕获事件执行,其它元素顺序不变。也就是说,绑定顺序只影响到目标元素的事件发生顺序。

相关文章

  • 说说 JavaScript 中的冒泡与捕获过程

    W3C 规范中定义了3个事件阶段,依次是捕获阶段 、 目标阶段 、 冒泡阶段。先捕获,后冒泡,捕获从上到下,就像石...

  • JavaScript 事件捕获和冒泡

    JavaScript 事件捕获和冒泡 规范 在最新的 DOM 规范中,事件的捕获与冒泡是通过 addEventLi...

  • JavaScript中的事件冒泡和事件捕获

    事件冒泡和事件捕获是JavaScript中最常用的术语。在JavaScript中,事件流过程由三个概念完成: 事件...

  • Javascript中的事件冒泡与捕获

    事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三...

  • JavaScript事件捕获冒泡与捕获

    事件流 JavaScript中,事件流指的是DOM事件流。 概念 事件的传播过程即DOM事件流。 事件对象在 DO...

  • 2017-7-18

    收获到了什么? 1. JavaScript的事件流 ―― 冒泡流和捕获流 冒泡流:从子元素到父元素的传递过程,由内...

  • JavaScript事件冒泡与捕获

    什么是冒泡与捕获 以click点击事件为例。假如我们有一个多层结构标签。如下图,是4个div嵌套。每个di...

  • 捕获和冒泡

    捕获:从外向内冒泡:从内向外 在一个事件发生时,捕获过程跟冒泡过程总是先后发生,跟你是否监听毫无关联,先捕获后冒泡...

  • JavaScript中事件句柄函数的this和even.targ

    由于JavaScript的事件模型中,事件触发开始,有一个捕获阶段和冒泡阶段(详见:关于JavaScript的ad...

  • JS事件的冒泡捕获--发生了什么

    多次遇到事件冒泡与捕获相关的题目,冒泡和捕获机制在不同浏览器中的兼容性也不相同,IE中默认只支持冒泡机制,冒泡和捕...

网友评论

    本文标题:说说 JavaScript 中的冒泡与捕获过程

    本文链接:https://www.haomeiwen.com/subject/zbclzhtx.html