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()

  • 相关阅读:
    第一次用NUnitAsp
    IT能够解决所有的商业问题吗?
    在这种东西里面,你会自在吗?
    看了段.net show之后的感想
    获取当前数据库中所有表的记录数
    对瀑布模型各阶段的解释
    Linux内核中的slab/slob/slub 在搞晕前先记下来
    分布式事务AT、TCC、Saga、XA 模式分析对比
    读懂Windows的“虚拟内存”为你量身定制
    示范NTFS 卷上的硬链接
  • 原文地址:https://www.cnblogs.com/aidixie/p/12133688.html
Copyright © 2011-2022 走看看