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 相关文章推荐
使用UglifyJS合并/压缩JavaScript的方法
Mar 07 Javascript
利用js读取动态网站从服务器端返回的数据
Feb 10 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
JavaScript实现的SHA-1加密算法完整实例
Feb 02 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
Feb 22 Javascript
作为老司机使用 React 总结的 11 个经验教训
Apr 08 Javascript
AngularJS改变元素显示状态
Apr 20 Javascript
js实现图片轮播效果学习笔记
Jul 26 Javascript
ES6 javascript中Class类继承用法实例详解
Oct 30 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
Dec 08 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 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
CodeIgniter辅助之第三方类库third_party用法分析
2016/01/20 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
python获取网页状态码示例
2014/03/30 Python
Python入门篇之字典
2014/10/17 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
python实现停车管理系统
2018/11/30 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
python os模块在系统管理中的应用
2020/06/22 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
Python self用法详解
2020/11/28 Python
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
明信片寄语大全
2014/04/08 职场文书
2014年度党员自我评议
2014/09/13 职场文书
学校师德师风整改方案
2014/10/28 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle