美文网首页
js中的事件传播流程

js中的事件传播流程

作者: IF_123 | 来源:发表于2019-03-07 22:03 被阅读0次

一 事件基础

JavaScript 事件是由访问 Web 页面的用户引起的一系列操作。
当用户执行某些操作的时候,再去执行一系列代码。或者用来获取事件的详细信息,
如鼠标位置、键盘按键等。

二 事件流

事件流描述的是页面接收事件的顺序。
事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件,这个传播过程即DOM事件流。

事件流的三个阶段

1.捕获阶段:事件对象从目标的祖先节点Window开始传播直至目标。
2.目标阶段:事件对象传递到事件目标。如果事件的type属性表明后面不会进行冒泡操作,那么事件到此就结束了。
3.冒泡阶段:事件对象以一个相反的方向进行传递,从目标开始,到Window对象结束。

事件的冒泡

事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。

事件的捕获

事件按照从最不特定的事件目标到最特定的事件目标(document对象)的顺序。
下面是一个实例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #outer{
                width: 200px;
                height: 200px;
                background: red;
            }
            #inner{
                width: 100px;
                height: 100px;
                background: blue;
            }
        </style>
    </head>
    <body>
        <div id="outer">
            <div id="inner"></div>
        </div>
        <script type="text/javascript">
            var outer = document.getElementById("outer");
            var inner = document.getElementById("inner");
            document.onclick = function(){
                console.log("document");
            }
            inner.onclick = function(e){
                var evt = e || event;
                console.log("inner");
            }
            outer.onclick = function(e){
                var evt = e || event;
                console.log("outer");
            }
        </script>
    </body>
</html>

当点击最外面的白色部分时,只触发document.onclick,控制台输出document


image.png

当点击红色部分时,触发outer.onclick,同时冒泡到document对象上,所以控制台输出outer和document


image.png
当点击蓝色部分时,触发inner.onclick,同时冒泡到outer和document对象上,所以控制台输出inner,outer,document
image.png

三 阻止事件冒泡

不同浏览器对阻止冒泡的写法存在兼容问题,在ie浏览器中阻止冒泡的方法是window.event.cancelBubble=true而在谷歌,火狐等浏览器的方法则是e.stopPropagation()
阻止事件在DOM中继续传播,即取消进一步的事件捕获或冒泡,防止再触发定义在别的节点上的监听函数,但是不包括在当前节点上新定义的事件监听函数。

outer.onclick = function(e){
    var evt = e || event;
    console.log("outer");
    if(evt.stopPropagation){
        evt.stopPropagation();
    }else{
        evt.cancelBubble = true;
    }
}

需要注意的是,我们无法在事件捕获阶段阻止事件冒泡!!!

四 事件委托

利用事件冒泡的特性,将里层的事件委托给外层事件,根据event对象的属性进行事件委托,改善性能。
使用事件委托能够避免对特定的每个节点添加事件监听器;事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。
举个例子,点击更多添加li,且点击每个li都输出aa,点击其他地方不显示。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            li{
                background: red;
                margin: 10px;
            }
        </style>
    </head>
    <body>
        <ul id="list">
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
        <input type="button" value="更多" id="btn">
        <script type="text/javascript">
            var oList = document.getElementById("list");
            var oBtn = document.getElementById("btn");
            var aLi = oList.children;
            oList.onclick = function(e){
                var evt = e || event;
                var _target = evt.target || evt.srcElement;
                if(_target.nodeName.toLowerCase() == "li"){
                    console.log("aa");
                }
            }
            oBtn.onclick = function(){
                for(var i = 0; i < 5; i++){
                    var oLi = document.createElement("li");
                    oList.appendChild(oLi);
                }
            }
        </script>
    </body>
</html>
image.png

相关文章

  • 前端面试(一)

    一、事件传播流程 js事件传播流程主要分为三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。 二、Ajax轮询—...

  • js中的事件传播流程

    一 事件基础 JavaScript 事件是由访问 Web 页面的用户引起的一系列操作。当用户执行某些操作的时候,再...

  • js事件传播流程

    什么是JavaScript事件? 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。js事件是由访问...

  • Js事件传播流程, 事件阻止

    js事件传播流程主要分三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。 在我们平常用的addEventLis...

  • 简述js事件传播流程

    一、概述 事件流:事件流描述的是从页面中接收事件的顺序。 DOM事件流传播的三个过程: 事件捕获阶段 ——》 处于...

  • JS 事件(2)

    1、事件传播机制、阻止传播、取消默认事件、事件代理这些到底是什么呢? ①事件传播机制:JS事件传播包括三个阶段: ...

  • js中的事件传播过程

    引子:父div添加监听事件,子div设置监听事件,点击子元素,会出现什么结果 事件传播的三个过程,事件捕获阶段、处...

  • Js事件传播流程及事件阻止与事件委托

    事件 什么是事件 HTML 事件是发生在 HTML 元素上的“事情”。当在 HTML 页面中使用 JavaScri...

  • js的事件传播

    事件的传播 关于事件的传播网景公司和微软公司有不同的理解, 微软公司认为事件应该是由内向外传播,也就是当事件触发...

  • js事件循环:微任务和宏任务

    浏览器JavaScript执行流程以及Node.js中的流程均基于事件循环。 了解事件循环的工作方式对于优化(有时...

网友评论

      本文标题:js中的事件传播流程

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