事件流

作者: 再见噜噜班 | 来源:发表于2019-12-30 15:04 被阅读0次

事件,就是文档或者浏览器与用户的交互瞬间。简单地说,就是当用户操作时,比如点击按钮,浏览器做出相应的回应。所谓事件流,就是页面中事件接收的顺序。目前,主要有两种事件流,事件冒泡流和事件捕获流。

<!DOCTYPE html>
<html lang="en" onclick="console.log(3)">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body onclick="console.log(2)">
    <div id='box' onclick="console.log(1)">click</div>
</body>
</html>

事件冒泡

事件冒泡的意思是事件从最具体的元素开始接收,然后逐级向上传播到不太具体的元素(或者是文档)。 例子中,如果你单击了id为box的div,其事件的传播轨迹是div>body>html>document


事件冒泡.jpg

事件捕获

事件捕获的意思是事件从最不具体的元素(或者文档)就开始接收,然后逐级向里层具体的元素传播。同样,如果你单击了id为box的div,其事件的传播轨迹是document>html>body>div

事件捕获.jpg
尽管“DOM2 级事件”规范要求事件应该从 document 对象开始传播,但大部分浏览器都是从 window 对象开始捕获事件的

事件流

"DOM2级事件"规定事件流分为三个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应。

事件流.jpg

为了更加清晰直观地理解事件,下面通过具体案例来讲解:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .outer{
            width: 400px;
            height: 200px;
            background: cadetblue;
        }
        .middle{
            width: 300px;
            height: 150px;
            background: indianred;
        }
        .inner{
            width:200px;
            height: 100px;
            background: lawngreen;
        }
    </style>
</head>
<body>
    <div class='outer'>外层div
        <div class='middle'>中层div
            <div class='inner'>里层div</div>
        </div>
    </div>
</body>
</html>
    //addEventListener最后这个布尔值参数如果是 true,表示在捕获阶段调用事件处理程序;如果是 false,表示在冒泡阶段调用事件处理程序。默认为false
    let capture = true
    window.addEventListener('click',()=>{
        console.log('window')
    },capture)
    document.addEventListener('click',()=>{
        console.log('document')
    },capture)
    let outer = document.getElementsByClassName('outer')
    outer[0].addEventListener('click',()=>{
        console.log('outer')
    },capture)
    let middle = document.getElementsByClassName('middle')
    middle[0].addEventListener('click',()=>{
        console.log('middle')
    },capture)
    let inner = document.getElementsByClassName('inner')
    inner[0].addEventListener('click',()=>{
        console.log('inner')
    },capture)
事件案例.jpg
addEventListener最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。默认为false
capturetrue时,采用的是捕获事件流,即事件从外向里传播,当我们点击最里层的div,控制台输出如图所示:
事件捕获案例.jpg
capturefalse时,采用的是冒泡事件流,即事件从里向外传播,当我们点击最里层的div,控制台输出如图所示:
事件冒泡案例.jpg
由于老版本的浏览器不支持,因此很少有人使用事件捕获。我们也建议读者放心地使用事件冒泡,在有特殊需要时再使用事件捕获。

相关文章

  • 手写事件模型及事件代理/委托

    事件流:事件流所描述的就是从页面中接受事件的顺序。IE:IE事件流是事件冒泡流;Netscape事件流是事件捕获流...

  • JavaScript事件探秘

    一、事件流 事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流...

  • 事件

    1. 事件 IE的事件流是事件冒泡流Netscape是的事件流是事件捕获流 DOM事件流 :规定事件包括三个阶段:...

  • JavaScript事件捕获冒泡与捕获

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

  • 事件流and事件处理程序

    事件流 什么是事件流 事件流描述得是从页面中接收事件的顺序 IE的事件流是事件冒泡流 Netscape Commu...

  • JS--事件(一)

    事件流 事件流描述的是从页面中接受事件的顺序,在IE中的事件流是事件冒泡,在Netscape的事件流是事件捕获流。...

  • 事件

    事件流 描述的是从页面中接收事件的顺序。 IE——事件冒泡流 Netscape——事件捕获流 事件冒泡流:即事件最...

  • JavaScript事件01——事件流

    大纲:概念(事件、事件流)事件流模型(事件冒泡、事件捕获、DOM事件流) 一、概念: 1、事件:事件就是用户或浏览...

  • 事件基础(2)

    js事件的三个阶段:捕获,目标,冒泡 IE:IE事件流是事件冒泡流 Netscape事件流是事件捕获流 IE事件...

  • 事 件

    1.事件流 事件流描述的是从页面中接收事件的顺序。有两种,分别是:事件冒泡流和事件捕获流。 事件冒泡IE的事件流叫...

网友评论

      本文标题:事件流

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