• JS事件冒泡、停止冒泡、addEventListener--实例演示


     前面说到的事件冒泡不是很明了,接上节问题,再记录一下

     <div class='item' id='outer' onclick="alert('outer')">
        <div class='item' id='inner' onclick="alert('inner');">
          <div class='item' id='core' onclick="alert('core')">
             core!!!!!
          </div>
        </div>
      </div>

    1.上面div中,如果单击core,会执行多少个alert?先后顺序是什么?

     该问题的答案取决于浏览器的对事件处理的机制。对于下图的结构,当两个element都绑定了onclick方法时,执行的顺序是什么?

    -----------------------------------
    | element1                        |
    |   -------------------------     |
    |   |element2               |     |
    |   -------------------------     |
    |                                 |
    -----------------------------------
    • Netscape主张元素1的事件首先发生,这种事件发生顺序被称为捕获型
    • 微软则保持元素2具有优先权,这种事件顺序被称为冒泡型
    • DOM同时支持两种事件模型:捕获型事件和冒泡型事件,但是,捕获型事件先发生。两种事件流会触发DOM中的所有对象,从document对象开始,也在document对象结束。

    冒泡型

         1.对于某个节点,触发的一个事件, 会首先执行当前这个dom节点绑定的方法

         2.执行完毕后,会冒泡至改节点的父节点,执行相应的函数

         3. 重复以上过程,直至Dom的根节点。

    对于上文中的例子, 单击#core,

         1.首先触发alert('core')

       2.然后冒泡至#inner节点,触发alert('inner')

         3.最后冒泡至#outer节点,触发alter('outer')

    假设对于#inner,我们未为onclick事件指定方法,那么在第二步,不会有方法执行,但是click的事件,仍会继续冒泡至最外层的#outer.

    捕获型

    事件捕获的顺序刚好与之相反

      1.当一个事件发生时,最外层的已绑定该事件的方法会执行

      2.然后该事件会下降至他的子节点,触发相应的方法

      3.重复1,2的过程

    如何加入一个捕获型/冒泡型事件

    •  参照上文给出的例子,我们直接在html中绑定事件方法, 这个事件就是冒泡型事件
     <div class='item' id='outer' onclick="alert('outer')">
    • 当采用原生Javascript(非Jquery)方法, 我们使用addEventListener绑定事件 当第三个参数是false的时候, 这个事件就是冒泡型事件(第三个参数的默认值是false).以下两种写法等价。
    core.addEventListener("click",function(){alert('dddddd')},false);
    core.addEventListener("click",function(){alert('dddddd')});
    •  我们使用addEventListener绑定事件 当第三个参数是true的时候, 这个事件就是捕获型事件
    core.addEventListener("click",function(){alert('dddddd')},true);
    •  addEventListe //IE方法,兼容代码前面写过了

      stopPropagation()是停止冒泡事件流。

          当我们为一个事件绑定的方法中,添加一句stopPropagation,那么该事件的冒泡过程到此为止,其后的所有节点绑定事件都不执行;

          没有方法去停止捕获事件流,当然,从功能上看也即没必要,也不合理。

    <div class = 'item'id = 'outer'> 
              <div class = 'item'id = 'core' > core !! !!!</div>
     </div> 
    <script type = 'text/javascript'>
    var core = document.getElementById('core');
    var outer = document.getElementById('outer');
    //addEventListener冒泡 core.addEventListener(
    "click",
    function(e) { alert('dd'); e.stopPropagation(); //阻止事件冒泡
    }, false);
    core.addEventListener("click",
    function(e) { alert('dd'); e.stopPropagation(); //阻止事件冒泡
    }, false);
    //onclick冒泡
    core.onclick = function(e) {
        alert('core');
        e.stopPropagation(); //阻止事件冒泡
    };
    outer.onclick = function(e) {
        alert('outer')
    };
    </script>

    下面是代码,保存成html文件,看看效果;

    <html>
    <head>
      <style type="text/css">
         .item{
             display: table;
             margin: 100px;
         }
         #outer{
             400px;
             height:400px;
             background-color: blue;         
         } 
         #inner{
             vertical-align: middle;
             200px;
             height:200px;
             background-color: white;         
         }
         #core{
             80px;
             height:80px;
             background-color: red;
             text-indent: 10px;
             line-height: 50px;         
         }
      </style>
    
      
    </head>
    <body>
      <div class='item' id='outer' onclick="alert('outer')">
        <div class='item' id='inner' onclick="alert('inner');stopbubble(arguments[0])">
          <div class='item' id='core' onclick="alert('core')">
             core!!!!!
          </div>
        </div>
      </div>
    </body>
    
    <!--you must write <script> under <body>-->
    <script type='text/javascript'>  
            var core = document.getElementById('core');
            core.addEventListener("click",function(){alert('dddddd')},false);
            //addEventListener: can add one more event to node "core"     
            function stopbubble(e){
                  e.stopPropagation();//stop bubble event on this node 
            }
    </script>
    </html>

    前端效果:

    点击core!!!后:
    1.先alert core 因为绑定了dddd,然后会alert  dddd;

    2.然后冒泡到inner节点后,alert inner,但是同时执行stopbubble(arguments[0])来停止冒泡;

    3.停止冒泡后,该node后续节点就不执行了,所以不会alert outer;

    转自:https://www.cnblogs.com/McQueen1987/p/3950547.html

  • 相关阅读:
    ATL接口返回类型&&ATL接口返回字符串BSTR*
    不允许使用抽象类类型
    error C2039: 'SetDefaultDllDirectories'错误解决办法<转>
    directshow 虚拟摄像头 实例 代码解读
    UML建模之时序图(Sequence Diagram)<转>
    【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>
    在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW
    struct 方法使用
    2014华为机试题目
    贪心-poj-2437-Muddy roads
  • 原文地址:https://www.cnblogs.com/7qin/p/9637763.html
Copyright © 2020-2023  润新知