• 捕获、冒泡与阻止事件传播


     前言:了解捕获与冒泡先了解"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()

  • 相关阅读:
    电子证书 DER & PEM & CRT & CER
    更新显卡驱动
    隐马尔可夫模型拼音汉字输入法
    隐马尔可夫模型:HMM
    numpy 随机产生数字
    python(62):保留两位小数
    训练的时候 nvidia:自动刷新
    python(61):str 和 bytes 转换
    tensorflow 笔记12:函数区别:placeholder,variable,get_variable,参数共享
    tensorflow 笔记11:tf.nn.dropout() 的使用
  • 原文地址:https://www.cnblogs.com/aidixie/p/12133688.html
Copyright © 2020-2023  润新知