Home >Web Front-end >JS Tutorial >Detailed explanation of the three stages of DOM event flow

Detailed explanation of the three stages of DOM event flow

青灯夜游
青灯夜游forward
2019-11-30 17:15:375691browse

When an event occurs, it will be propagated among element nodes in a specific order. This propagation process is DOM event stream.

Detailed explanation of the three stages of DOM event flow

DOM event flow is divided into three stages, namely:

Capture phase:The stage in which events are propagated from top to bottom from the Document node to the target node;

Target phase:The real target node is processing the event;

Bubbling Stage : The stage in which events are propagated from the target node to the Document node from top to bottom.

Capture phase:

<!DOCTYPE html>
<html>

<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>
        .father {
            overflow: hidden;
            width: 300px;
            height: 300px;
            margin: 100px auto;
            background-color: pink;
            text-align: center;
        }
        
        .son {
            width: 200px;
            height: 200px;
            margin: 50px;
            background-color: purple;
            line-height: 200px;
            color: #fff;
        }
    </style>
</head>

<body>
    <div>
        <div>son盒子</div>
    </div>
    <script>
        var son = document.querySelector('.son');
        son.addEventListener('click', function() {
            console.log('son');
        }, true);
        var father = document.querySelector('.father');
        father.addEventListener('click', function() {
            console.log('father');
        }, true);
        document.addEventListener('click', function() {
            console.log('document');
        }, true);
    </script>
</body>

</html>

The console output is:

It can be seen that the capture phase events are propagated from the Document node to the target node from top to bottom.

Bubble stage:

<script>
        var son = document.querySelector('.son');
        son.addEventListener('click', function() {
            console.log('son');
        }, false);
        var father = document.querySelector('.father');
        father.addEventListener('click', function() {
            console.log('father');
        }, false);
        document.addEventListener('click', function() {
            console.log('document');
        })
    </script>

The console output is:

It can be seen that the bubbling phase events are propagated from the target node to the Document node from top to bottom.

Note:

1. JS code can only execute one of the capturing or bubbling stages (either capturing Either bubbling)

2, onclick and attachEvent (ie) can only get the bubbling stage

3, addEventListener(type, listener [, useCapture]) If the third parameter is true, it means calling the event handler in the event capture phase ; if it is false (do not write The default is false), which means that the event handler is called during the event bubbling stage

4. In actual development, we rarely use event capture. Pay more attention to event bubbling

5. Some events do not bubble, such as onblur, onfocus, onmouseenter, onmouseleave

6. Events The bubbling sometimes causes trouble, but it can be stopped. The method is: stopPropagation()

stopPropagation() method : Termination events are propagated further during the capture, target processing, or bubbling phases of the propagation process. After calling this method, the handler for the event on that node will be called and the event will no longer be dispatched to other nodes.

This article comes from the js tutorial column, welcome to learn!

The above is the detailed content of Detailed explanation of the three stages of DOM event flow. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:cnblogs.com. If there is any infringement, please contact admin@php.cn delete