zoukankan      html  css  js  c++  java
  • 简析JavaScript事件冒泡机制

    微信小程序中每个item都有一个事件绑定,catchtap="detailTap" 用户点击触发事件,有些大部分组件共有的事件,如:touchstart、touchmove、touchend、touchcancel、longtap、tap,这六个事件都是会冒泡的事件,除此之外,其他事件都是非冒泡事件,事件绑定的方式是用bind或catch加上小写的事件名称,如catchtap,bindtap。其中bind允许冒泡传递,catch会阻止冒泡,把所有事件变为非冒泡事件。

    响应函数一般存在event参数,event.target和event.currentTarget存在区别,前者永远指向触发事件的组件,后者是因为事件冒泡机制设置的,指向事件当前指向的组件。

    浏览器客服端中基本都是事件驱动,即事件发生 > 做出相应动作;

     事件冒泡是指事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。事件捕获是事件从最不精确的对象(document 对象)开始触发,然后到最精确。

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body id="body">
     8 <div id="box1" class="box1">
     9     <div id="box2" class="box2">
    10         <span id="span">span</span>
    11     </div>
    12 </div>
    13 </body>
    14 </html>
    15 
    16 <style>
    17     body,#box1,#box2,#span{padding: 20px;}
    18     body{background-color: cornflowerblue;display: block;}
    19     #box1{background-color: #ffd705;}
    20     #box2{background-color: aquamarine;}
    21     #span{background-color: orangered;}
    22 </style>
    23 
    24 <script type="text/javascript">
    25     window.onload = function() {
    26         document.getElementById("body").addEventListener("click",eventHandler);
    27     }
    28     function eventHandler(event) {
    29         console.log("时间:"+new Date(event.timeStamp)+" 产生事件的节点:" + event.target.id +"  当前节点:"+event.currentTarget.id);
    30     }
    31 </script>

    运行结果如下:

    pop.html:29 时间:Thu Jan 01 1970 08:00:11 GMT+0800 (中国标准时间) 产生事件的节点:body 当前节点:body
    pop.html:29 时间:Thu Jan 01 1970 08:00:14 GMT+0800 (中国标准时间) 产生事件的节点:box1 当前节点:body
    pop.html:29 时间:Thu Jan 01 1970 08:00:14 GMT+0800 (中国标准时间) 产生事件的节点:box2 当前节点:body
    pop.html:29 时间:Thu Jan 01 1970 08:00:15 GMT+0800 (中国标准时间) 产生事件的节点:span 当前节点:body

     当这些元素被点击,最终都会传递到body,

     如何阻止事件冒泡

    1.在对应事件内加入event.stopPropagation(),终止事件的广播分发,在IE下设置cancelBubble = true;
    在捕获的过程中stopPropagation();后,后面的冒泡过程也不会发生了。

    2.判断此时event.target和event.currentTarget是否相等

    3.阻止事件的默认行为,例如click <a>后的跳转,在W3c中,使用preventDefault()方法,在IE下设置window.event.returnValue = false;

    4.事件委托,通过给body 元素添加事件监听,然后通过判断event.target 然后对不同的target产生不同的行为

     

     1 <script type="text/javascript">  
     2     window.onload = function() {  
     3         document.getElementById("body").addEventListener("click",eventPerformed);  
     4     }  
     5     function eventPerformed(event) {  
     6         var target = event.target;  
     7         switch (target.id) {  
     8         case "span":   
     9             alert("您好,我是span。");  
    10             break;  
    11         case "div1":  
    12             alert("您好,我是第二层div。");  
    13             break;  
    14         case "div2":  
    15              alert("您好,我是最外层div。");  
    16             break;  
    17         }  
    18     }  
    19 </script>  

    参考链接: 

     https://my.oschina.net/jsongo/blog/755722

     http://www.111cn.net/wy/js-ajax/93133.htm

     http://blog.csdn.net/luanlouis/article/details/23927347

     

     

     

     好好学习,天天向上,有错欢迎指正!

     

     

     

     

     

     

     

     

  • 相关阅读:
    webstorm11.0下载地址和webstorm11.0破解程序patcher.exe下载使用方法说明 前端IDE工具的利器
    20151224今天发现到的两篇关于CSS架构、可复用可维护CSS和CSS学习提升能有改变思想观念意识的文章 分别是CSS架构目标和说说CSS学习中的瓶颈
    GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则
    HTML过滤器,用于去除XSS漏洞隐患。
    springboot的快速集成多数据源的启动器
    Springboot根据url后缀返回json或者xml或者html
    Springboot打包成War包并使其可以部署到Tomcat中直接运行
    数据脱敏工具类(包含手机号,银行卡号,邮箱,中文名称等)
    MySQL函数find_in_set介绍
    防止同一IP多次请求攻击
  • 原文地址:https://www.cnblogs.com/xcrh/p/6374759.html
Copyright © 2011-2022 走看看