如何阻止事件冒泡及默认事件

        大家好,我是IT修真院学员,一枚正直纯洁善良的WEB程序员,今天给大家分享一下,修真院官网JS任务4,深度思考中的知识点——如何阻止事件冒泡及默认事件.

一、背景介绍

1、冒泡事件

        一个完整的事件过程包括捕获-目标-冒泡

                                                        

        什么是冒泡事件?如果页面上有一个button,并且绑定了点击事件(或者其它的事件),当你点击button的时候如果body中也绑定了一个点击事件(或者其它的事件),那么body中的点击事件也会出发。事件从盒子嵌套的最深处传播(propagation)到最外层的过程就叫做冒泡(bubbling)。

2、默认事件

        默认事件又是什么呢?默认事件是针对浏览器而言的,是浏览器的默认行为(browser default actions),

        例如:

        点击一个链接——跳转;

        在表单中点击submit按钮——向服务器发送数据;

        在文本上按住鼠标左键并移动——选中文本;

        这些都是默认事件。

二、知识剖析

        对于事件的冒泡及默认事件在一些情况下我们并不希望它发生,这时我们可以选择阻止他们的活动。

1、阻止事件冒泡

        如果你是通过addEventListener添加的事件,那么以用下面这个方法阻止事件传播:

        1)event.stopPropagation();

        2)return false;

       如果你需要支持不遵循W3C推荐标准的传统浏览器,通常在一个函数中需要使用如下内容:

function(e) {
  var event = e || window.event; 
  //code
  event.stopPropagation()
  //return false
 }

        如果你是在标签中用on<event>来绑定事件,那么需要这样做:

<span onclick="event.stopPropagation(); 
    alert('you clicked inside the header');" 
    window.event.cancelBubble = "true">
</span>

        但是,一般来说,如果你需要任何复杂的东西,比如停止传播,那么应该避免内联事件处理程序。将事件处理程序单独编写,并将它们绑定到元素中,这在中长期项目中是一个更好的主意,可读性高,维护性也好。

2、阻止默认事件

        有两种方法:

        1)event.preventDefault();

        2)return false;

        如果你是在标签中用on<event>来绑定事件,那么只能用 return false;

例如,阻止input获得焦点:

<input value="Focus works" onfocus="this.value=''">
<input onmousedown="return false" onfocus="this.value=''" value="Click me">

三、常见问题

        1、AngularJS中如何阻止默认事件?

        2、事件执行的三个阶段是什么?


四、解决方案

        1、$ecent.preventDefault();

        2、捕获阶段——目标阶段——冒泡阶段。

五、编码实战

六、拓展思考

七、参考文献

参考一: 事件委托

参考二: 事件冒泡、事件捕获和事件委托

参考三: 阻止事件冒泡,阻止默认事件

八、更多讨论

Q1:如何解除事件绑定?

A1:

attachEvent(事件名,函数)  //IE

addEventListener(事件名,函数 false)  //FireFox Chrome

Q2:用冒泡还是捕获?

A2:为了兼容IE低版本浏览器最好用冒泡,而且事件的默认方式是冒泡;

Q3:事件代理(委托)的原理及优缺点

A3:   原理:利用冒泡原理,将元素的事件绑定到父级元素上;

        优点:

        1、如果要用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只需要交互一次,这样就能大大的减少与dom的交互次数,提高性能

        2、新增节点不必再手动添加事件;

        缺点:应用场景少





 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值