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 相关文章推荐
jQuery 操作XML入门
Dec 25 Javascript
JS 图片缩放效果代码
Jun 09 Javascript
javascript smipleChart 简单图标类
Jan 12 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
javascript数组遍历for与for in区别详解
Dec 04 Javascript
JQuery解析XML的方法小结
Apr 02 Javascript
树结构之JavaScript
Jan 24 Javascript
详解VueJS应用中管理用户权限
Feb 02 Javascript
vue中element 上传功能的实现思路
Jul 06 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
PHP中的Session对象如何使用
2015/09/25 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
python3将变量写入SQL语句的实现方式
2020/03/02 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Python xlwt模块使用代码实例
2020/06/10 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
工作个人的自我评价
2014/01/14 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
少年犯观后感
2015/06/11 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
学生会自荐信
2019/05/16 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python