zoukankan      html  css  js  c++  java
  • 捕获、冒泡与阻止事件传播

     前言:了解捕获与冒泡先了解"addEventListener"

      addEventListener() 方法用于向指定元素添加事件句柄。ie8及以下不支持

      element.addEventListener(eventfunctionuseCapture)

       
       
       
    event 必须。字符串,指定事件名。

    注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。 
    function 必须。指定要事件触发时执行的函数。 

    当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。
    useCapture 可选。布尔值,指定事件是否在捕获或冒泡阶段执行。

    可能值:
    • true - 事件句柄在捕获阶段执行
    • false- 默认。事件句柄在冒泡阶段执行

     

    例子一:点击最内层div块,查看弹出的值

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <style type="text/css">
            #div1{
                 500px;
                height: 500px;
            }
            div{
                 75%;
                height: 75%;
                border: 1px solid #007AFF;
            }
        </style>
        <body>
            <div id="div1">
                <div id="div2">
                    <div id="div3"></div>
                </div>
            </div>
        </body>
        <script type="text/javascript">
            window.onload = function(){
                var div1 = document.getElementById('div1');
                var div2 = document.getElementById('div2');
                var div3 = document.getElementById('div3');
                
                div1.addEventListener('click',function(){
                    console.log('捕获-外层')
                },true);
                div2.addEventListener('click',function(e){
                    console.log('捕获-中间层');
                    // e.stopPropagation()
                },true);
                div3.addEventListener('click',function(){
                    console.log('捕获-内层')
                },true);
                
                div1.addEventListener('click',function(){
                    console.log('冒泡-外层')
                },false);
                div2.addEventListener('click',function(e){
                    console.log('冒泡-中间层')
                    // e.stopPropagation();
                },false);
                div3.addEventListener('click',function(){
                    console.log('冒泡-内层')
                },false);
            }
        </script>
    </html>

      

    例子二:点击最内层div块,查看弹出的值

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <style type="text/css">
            #div1{
                 500px;
                height: 500px;
            }
            div{
                 75%;
                height: 75%;
                border: 1px solid #007AFF;
            }
        </style>
        <body>
            <div id="div1">
                <div id="div2">
                    <div id="div3"></div>
                </div>
            </div>
        </body>
        <script type="text/javascript">
            window.onload = function(){
                var div1 = document.getElementById('div1');
                var div2 = document.getElementById('div2');
                var div3 = document.getElementById('div3');
                
                div1.addEventListener('click',function(){
                    console.log('冒泡-外层')
                },false);
                div2.addEventListener('click',function(e){
                    console.log('冒泡-中间层')
                    // e.stopPropagation();
                },false);
                div3.addEventListener('click',function(){
                    console.log('冒泡-内层')
                },false);
                
                div1.addEventListener('click',function(){
                    console.log('捕获-外层')
                },true);
                div2.addEventListener('click',function(e){
                    console.log('捕获-中间层');
                    // e.stopPropagation()
                },true);
                div3.addEventListener('click',function(){
                    console.log('捕获-内层')
                },true);
            }
        </script>
    </html>

    例子总结:事件流执行的顺序

    由先依次执行外层捕获事件

    事件流到达事件对象时,如果事件对象的捕获事件在前,则先执行捕获事件,再执行事件对象的冒泡事件

    再依次执行外层的冒泡事件

     

    事件流到达事件对象时,如果事件对象的冒泡事件在前,则先执行冒泡事件,再执行事件对象的捕获事件

     

    阻止事件流: event.stopPropagation(),能够直接切断事件流,后续无论是冒泡还是捕获都无法继续执行

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
        </head>
        <style type="text/css">
            #div1{
                 500px;
                height: 500px;
            }
            div{
                 75%;
                height: 75%;
                border: 1px solid #007AFF;
            }
        </style>
        <body>
            <div id="div1">
                <div id="div2">
                    <div id="div3"></div>
                </div>
            </div>
        </body>
        <script type="text/javascript">
            window.onload = function(){
                var div1 = document.getElementById('div1');
                var div2 = document.getElementById('div2');
                var div3 = document.getElementById('div3');
                
                div1.addEventListener('click',function(){
                    console.log('冒泡-外层')
                },false);
                div2.addEventListener('click',function(e){
                    console.log('冒泡-中间层')
                },false);
                div3.addEventListener('click',function(){
                    console.log('冒泡-内层')
                },false);
                
                div1.addEventListener('click',function(){
                    console.log('捕获-外层')
                },true);
                div2.addEventListener('click',function(e){
                    console.log('捕获-中间层');
                    e.stopPropagation()
                },true);
                div3.addEventListener('click',function(){
                    console.log('捕获-内层')
                },true);
            }
        </script>
    </html>

    阻止默认事件: event.preventDefault()

  • 相关阅读:
    简单工厂、工厂方法和抽象工厂的学习笔记
    单一职责原则,开-闭原则,依赖倒置原则
    我对面向对象设计的理解——Java接口和Java抽象类
    高可用与负载均衡的区别
    应用交付、负载均衡(Load balancing)、高可用、F5
    四种常见的 POST 提交数据方式
    Git fetch和git pull的区别
    苹果Mac OS X显示隐藏文件的方法
    Appium教程---Client/Server Architecture
    UNIX网络编程——使用线程的TCP回射服务器程序
  • 原文地址:https://www.cnblogs.com/aidixie/p/12133688.html
Copyright © 2011-2022 走看看