当前位置: 首页 > 面试题库 >

JavaScript什么是事件冒泡和捕获?

佘京
2023-03-14
问题内容

事件冒泡和捕获之间有什么区别?什么时候应该使用冒泡与捕获?


问题答案:

事件冒泡和捕获是HTML DOM
API中事件传播的两种方式,当事件发生在另一个元素内部的元素中,并且两个元素都已注册了该事件的句柄时。事件传播模式确定元素以什么顺序接收事件。

冒泡时,事件首先由最内层元素捕获和处理,然后传播到外层元素。

通过捕获,事件首先被最外面的元素捕获并传播到内部元素。

捕获也称为“滴答”,它有助于记住传播顺序:

down流,冒泡

过去,Netscape提倡事件捕获,而Microsoft提倡事件冒泡。两者都是W3C 文档对象模型事件标准(2000)的一部分。

IE <9 仅使用事件冒泡,而IE9 +和所有主流浏览器均支持。另一方面,对于复杂的DOM ,事件冒泡的性能可能会稍低。

我们可以addEventListener(type, listener, useCapture)在冒泡(默认)或捕获模式下使用来注册事件处理程序。要使用捕获模型,请将第三个参数传递为true

<div>
    <ul>
        <li></li>
    </ul>
</div>

在上面的结构中,假定li元素中发生了单击事件。

在捕获模型中,事件将首先处理(将div首先div触发will 中的click事件处理程序),然后在中处理ul,然后在目标元素中最后处理li

在冒泡模型中,将发生相反的情况:事件将首先由li,然后由ul,最后由div元素处理。

在下面的示例中,如果单击任何突出显示的元素,则可以看到事件传播流的捕获阶段首先发生,然后是冒泡阶段。

var logElement = document.getElementById('log');



function log(msg) {

    logElement.innerHTML += ('<p>' + msg + '</p>');

}



function capture() {

    log('capture: ' + this.firstChild.nodeValue.trim());

}



function bubble() {

    log('bubble: ' + this.firstChild.nodeValue.trim());

}



function clearOutput() {

    logElement.innerHTML = "";

}



var divs = document.getElementsByTagName('div');

for (var i = 0; i < divs.length; i++) {

    divs[i].addEventListener('click', capture, true);

    divs[i].addEventListener('click', bubble, false);

}

var clearButton = document.getElementById('clear');

clearButton.addEventListener('click', clearOutput);


p {

    line-height: 0;

}



div {

    display:inline-block;

    padding: 5px;



    background: #fff;

    border: 1px solid #aaa;

    cursor: pointer;

}



div:hover {

    border: 1px solid #faa;

    background: #fdd;

}


<div>1

    <div>2

        <div>3

            <div>4

                <div>5</div>

            </div>

        </div>

    </div>

</div>

<button id="clear">clear output</button>

<section id="log"></section>


 类似资料:
  • 主要内容:事件捕获,事件冒泡,阻止事件捕获和冒泡,阻止默认操作在 JavaScript 中,我们将事件发生的顺序称为“事件流”,当我们触发某个事件时,会发生一些列的连锁反应,例如有如下所示的一段代码: 如果给每个标签都定义事件,当我们点击其中的 标签时,会发现绑定在 和 标签上的事件也被触发了,这到底是为什么呢?为了解答这一问题,微软和网景两公司提出了两种不同的概念,事件捕获与事件冒泡: 事件捕获:由微软公司提出,事件从文档根节点(Document 对象)流

  • 本文向大家介绍浅谈javascript中的事件冒泡和事件捕获,包括了浅谈javascript中的事件冒泡和事件捕获的使用技巧和注意事项,需要的朋友参考一下 1.事件冒泡   IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。以下面的HTML 页面为例: 如果你单击了页面中的<div

  • 本文向大家介绍JS中事件冒泡和事件捕获介绍,包括了JS中事件冒泡和事件捕获介绍的使用技巧和注意事项,需要的朋友参考一下 谈起JavaScript的 事件,事件冒泡、事件捕获、阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免。 事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。 事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一

  • 让我们从一个示例开始。 处理程序(handler)被分配给了 <div>,但是如果你点击任何嵌套的标签(例如 <em> 或 <code>),该处理程序也会运行: <div onclick="alert('The handler!')"> <em>If you click on <code>EM</code>, the handler on <code>DIV</code> runs.</em>

  • 本文向大家介绍详解javascript事件冒泡,包括了详解javascript事件冒泡的使用技巧和注意事项,需要的朋友参考一下 事件是javascript中的核心内容之一,在对事件的应用中不可避免的要涉及到一个重要的概念,那就是事件冒泡,在介绍事件冒泡之前,先介绍一下另一个重要的概念事件流: 一.什么是事件流: 文档对象模型(DOM)是一个树形结构,可以形象的用下图表示。 如果一个html元素触发

  • 注意 目前仅 Weex Native(Android 和 iOS)支持,web 端 暂时不支持此项特性. 如果你是个 web 开发者,你大概对浏览器事件冒泡机制已经很熟悉了,而且可能认为 Weex 默认会支持事件冒泡。然而,Weex 在 0.13 之前是不支持这一特性的,在 0.13 版本,Weex 提供了这项支持。 概念 以点击事件为例,比如一个点击事件发生在某个 <video> 元素上,这个元