Javascript Event(事件)的传播与冒泡


Posted in Javascript onJanuary 23, 2017

特性说明和原理图:

Javascript Event(事件)的传播与冒泡

  • 标准浏览器和Ie9+浏览器都支持事件的冒泡和捕获,而IE8-浏览器只支持冒泡
  • 标准和Ie9+浏览器用stopPropagation()或cancelBubble阻止事件传播,而ie8-用e.cancelBubble属性来阻冒泡,注意ie9不支持cancelBubble属性(设置后不生效),但chrome、safari、opera、firefox都支持cancelBubble属性。
  • Ie8-用attachEvent为dom元素添加一个事件,但必须在事件名前加上on,此类事件只能在元素的冒泡阶段。
  • stopPropagatin()方法用于阻止事件的传播,如果设置在捕获阶段,则目标和冒泡阶段不会被执行;
  • cancelBubble属性只能阻止冒泡阶段,对捕获和目标阶段的事件不能阻止
  • preventDefault()和window.event.returnValue用于标准浏览器和ie9+,都可以阻止默认事件。ie8-可以用returnValue,preventDefault()。

示例代码(ie8-示例不提供)

html代码

<body class="body" > 
 <div class="log"></div>
 <input type="text" id="inTxt" name="intxt" />
<div class="wrap">
 <div class="cont">
  <button type="button" class="button" id="btn">按钮</button>
  <select name="stopType" id="stopType">
    <option value="1">StopPropagation</option>
    <option value="2">cancelBubble</option>
  </select>
  <button type="button" class="button" id="btnReject">cont阻止捕获或冒泡</button>
 </div>
</div>
</body>

层级关系:body->wrap->cont->button,可以对照上面的原理

Js代码

$(function(){
    var $log = $('.log'), 
      $wrap = $('.wrap'),
      $cont = $('.cont'),
      $btn = document.getElementById('btn'),
      $stopType = $('#stopType'),
      $body = $('body'),
      $inTxt = $('#inTxt'),
      $btnReject = $('#btnReject');
    var ePhase = ["","捕获","目标","冒泡"]
    var setBorderColor = function( $dom, color, time,event){
      $dom = $($dom);
      $log.html($log.html() + $dom.attr('class') + '[' + ePhase[event.eventPhase] + ']' + '<br/>')
      var timeIndex = window.setTimeout(function(){   
      $dom.css({
        'borderColor': color,
        'borderWidth': '4px'
      });
      }, time);
    }  
    //捕获
    $body[0].addEventListener('click',function(event){ 
      $log.html($log.html() + "-------------------<br>");
      setBorderColor($body,'#0866ff ',0,event);
    },true);  
    $wrap[0].addEventListener('click',function(event){
      setBorderColor($wrap,'yellow',2000,event); 
    },true);
    $cont[0].addEventListener('click',function(event){
      event = event || window.event;
      if( $stopType.val() == '1' ){
        event.stopPropagation();
      }else{
        event.cancelBubble = true;
      }
      setBorderColor($cont,'green',1000,event);  
    },true); 
    $btn.addEventListener('click', function(event){ 
      setBorderColor($btn,'red',0,event);
    },true);
    $btnReject[0].addEventListener('click',function(event){ 
      setBorderColor($btnReject,'gray ',0,event);
    },true);
    //冒泡
    $body[0].addEventListener('click',function(event){
      setBorderColor($body,'#0866ff ',0,event);
    },false); 
    $wrap[0].addEventListener('click',function(event){
      setBorderColor($wrap,'yellow',2000,event); 
    },false); 
    $cont[0].addEventListener('click',function(event){
      setBorderColor($cont,'green',1000,event);  
    },false); 
    $btn.addEventListener('click', function(event){ 
      setBorderColor($btn,'red',0,event);
    },false);
    $btnReject[0].addEventListener('click',function(event){ 
      setBorderColor($btnReject,'gray ',0,event);
    },false);
    //阻止默认事件
    $inTxt.keypress(function(event){
      //event.preventDefault(); 
      window.event.returnValue = false;
      $body.append( String.fromCharCode( event.keyCode ));
    });
  });
  1. 实现一个完整的event流的Demo
  2. 在cont的捕获事件处有阻止事件传播的代码
  3. 阻止默认事件只用于验证

效果图

Javascript Event(事件)的传播与冒泡

应用场景

  • 捕获阶段的事件应用场景较少,一般情况下都应用在目标和冒泡阶段。
  • 现阶段w3c的标准事件已普遍受支持,如果不兼容ie8-浏览器可以废弃一些兼容性代码。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
JS 两日期相减,获得天数的小例子(兼容IE,FF)
Jul 01 Javascript
JS注释所产生的bug 即使注释也会执行
Nov 19 Javascript
jQuery实现带分组数据的Table表头排序实例分析
Nov 24 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
Nov 29 Javascript
基于jQuery实现数字滚动效果
Jan 16 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
Mar 27 jQuery
详解如何将 Vue-cli 改造成支持多页面的 history 模式
Nov 20 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 Javascript
JS实现的简单折叠展开动画效果示例
Apr 28 Javascript
js实现按钮开关单机下拉菜单效果
Nov 22 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 Javascript
js选项卡的制作方法
Jan 23 #Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
Jan 23 #Javascript
详解javascript中对数据格式化的思考
Jan 23 #Javascript
JavaScript 栈的详解及实例代码
Jan 22 #Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 #Javascript
前端分页功能的实现以及原理(jQuery)
Jan 22 #Javascript
JavaScript 事件对内存和性能的影响
Jan 22 #Javascript
You might like
PHP常用函数小技巧
2008/09/11 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
jQuery 选择器理解
2010/03/16 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python实现按行分割文件
2019/07/22 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
explicit和implicit的含义
2012/11/15 面试题
回门宴父母答谢词
2014/01/26 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书