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 相关文章推荐
JavaScript 动态改变图片大小
Jun 11 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
js querySelector() 使用方法
Dec 21 Javascript
详解如何使用webpack+es6开发angular1.x
Aug 16 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
vue-prop父组件向子组件进行传值的方法
Mar 01 Javascript
详解Webpack loader 之 file-loader
Nov 07 Javascript
详解Vue中使用Axios拦截器
Apr 22 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
Apr 15 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
Oct 09 jQuery
超详细小程序定位地图模块全系列开发教学
Nov 24 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 大数据量及海量数据处理算法总结
2011/05/07 PHP
解析php类的注册与自动加载
2013/07/05 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
Python实现替换文件中指定内容的方法
2018/03/19 Python
python实现AES加密解密
2019/03/28 Python
python3 pygame实现接小球游戏
2019/05/14 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
python利用opencv保存、播放视频
2020/11/02 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
岗位竞聘书范文
2014/03/31 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
学校实习推荐信
2015/03/27 职场文书
小平您好观后感
2015/06/09 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
医德医风学习心得体会
2016/01/25 职场文书