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 ));
        });

    });
  • 实现一个完整的event流的Demo
  • 在cont的捕获事件处有阻止事件传播的代码
  • 阻止默认事件只用于验证

应用场景

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

绘图-视图遮罩MaskView的使用

可以这样理解,是将maskView每个point的alpha赋值给View的重叠部分相对应的point,这样view的重叠每个point都有个alpha值了,v...

1512
来自专栏Java帮帮-微信公众号-技术文章全总结

开发者需要掌握的JS事件

JavaScript事件 ? 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。事件是基于对象存在,事件通常可以修饰多种对象。 1.为对象添加事件...

4448
来自专栏Thinks

【译】W3C WAI-ARIA最佳实践 -- 表单

三态复选框的一种常见使用场景是在软件安装时,一个单独的三态复选框用来代表和控制整个安装选项组的状态。并且,该组中的每个选项都可以单独使用双态复选框开启或关闭。

4743
来自专栏互联网杂技

接上一篇事件详解

事件类型: DOM3级事件规定了以下几类事件;如下: UI事件: 当用户与页面上的元素交互时触发; load事件:当页面加载完后(包括所有图像,所有javasc...

3696
来自专栏前端知识分享

第53天:鼠标事件、event事件对象

-->鼠标事件 -->event事件对象 -->默认事件 -->键盘事件(keyCode) -->拖拽效果

1372
来自专栏游戏杂谈

仿Google+相册的动画

鼠标移入、移出时均有动画效果,咋一看估计是使用了css3的transform属性来实现动画效果的。

1801
来自专栏Android小菜鸡

自定义View学习之路(四)————图片介绍框

  走往android的进阶之路,避不开自定义View的学习和绘制。这里以绘制一个可用的图片相框为例。开始系统的学习View的绘制。   麻雀虽小却五脏俱全,...

771
来自专栏企鹅号快讯

自动化平台搭建之css样式详解(二)

往往在搭建自动化平台时,我们可能涉及到一些页面,搭建页面对于CSS样式比较头大,那么今天为大家总结一篇文章,希望对大家有帮助,以及页面涉及验证,简单使用vali...

2125
来自专栏从零开始学 Web 前端

html学习笔记(一)

单标签 <! Doctype html> 双标签 <html> </html> <head></head> <title></title>

6925
来自专栏CaiRui

Html再学

1.  Html是网页的载体。内容就是网页制作者放在页面上想要用户浏览的信息,可以包括文字、图片、视频等。 2.  CSS样式是展现。就像网页的外衣。比如,标题...

2896

扫码关注云+社区

领取腾讯云代金券