浅谈js事件流

什么是事件流? 事件流分为三个阶段即:事件捕获阶段、处于目标阶段、事件冒泡阶段 什么是事件捕获? 当某个事件发生时,父元素应该更早接收到事件,具体元素则最后接收到事件 如下面例子:

<ul id="js_ul">
    <li id="js_li">
        <button id="js_click_me">点我吖</button>
    </li>
</ul>
// addEventListener的第三参数为true时,即是事件捕获,为false即是事件冒泡
let button = document.getElementById('js_click_me'),
        ul = document.getElementById('js_ul'),
        li = document.getElementById('js_li'),
        body = document.body,
        html = document.documentElement;
    button.addEventListener('click', function(e) {
        console.log('button');
    }, true);
    ul.addEventListener('click', function(e) {
        console.log('ul');
    }, true);
    li.addEventListener('click', function(e) {
        console.log('li');
    }, true);
    body.addEventListener('click', function(e) {
        console.log('body');
    }, true);
    html.addEventListener('click', function(e) {
        console.log('html');
    }, true);
    document.addEventListener('click', function(e) {
        console.log('document');
    }, true);
    window.addEventListener('click', function(e) {
        console.log('window');
    }, true);

如果点击button,那么这个事件发生的顺序是这样的: 1.window 2.document 3.html 4.body 5.ul 6.li 7.button 什么是事件冒泡? 由最具体的元素接收,然后逐级向上传播到不具体的节点 这里只需要将上面的addEventListener的第三个参数修改为false即可 如果点击button,那么这个事件发生的顺序是这样的: 1.button 2.li 3.ul 4.body 5.html 6.document 7.window