个人笔记,如有错误,望指出。

事件冒泡,举个列子:

<li>
<a href='http://www.baidu.com'>点击a</a>
</li>
<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function () {
alert('点击了a');
});
</script>

当你点击a的时候,会先弹出‘点击了a’,再弹出‘点击了li’,最后跳转到百度。简单理解就是先执行子元素的事件,再执行父元素的事件,跟事件捕获相反。

有些时候,我们不希望发生父元素的事件,只发生子元素的事件,这时候就需要阻止事件冒泡。分析一下事件冒泡,顺便分析一下阻止浏览器默认行为的一些方法:

1、event.stopPropagation();(阻止冒泡)

2、event.cancelBubble = true;(阻止冒泡)

3、event.preventDefault();(阻止浏览器默认行为)

4、return false;(有很多行为)

一、event.stopPropagation();

<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function (event) {
alert('点击了a');
event.stopPropagation();
});
</script>

完美阻止了li元素的冒泡,并且不会影响a的事件。效果是:先弹出‘点击了a’,然后跳转百度

注:之前看到说是不兼容IE8及一下,亲测IE6以上没问题,如有错,望指出。

二、event.cancelBubble = true;

<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function () {
alert('点击了a');
console.log(event);
event.cancelBubble = true;
});
</script>

使用cancelBubble需要注意:

event事件是窗口的MouseEvent,此处console.log打印的是:MouseEvent {isTrusted: true, screenX: 55, screenY: 90, clientX: 55, clientY: 29…}

。效果跟上面的是一样:先弹出‘点击了a’,然后跳转百度。刚刚测的时候,好像兼容性也还好。

三、event.preventDefault();

<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function (event) {
alert('点击了a');
event.preventDefault();
});
</script>

执行后的效果:先弹出‘点击了a’,再弹出‘点击了li’,但是,不执行跳转!不执行跳转!不执行跳转!

其实,default英文意思是默认的,想想不难理解,页面中,除了执行监听事件还会触发浏览器默认动作; 执行监听事件在前, 触发浏览器默认动作在后。

preventDefault并不是阻止事件冒泡,只是阻止浏览器的默认动作。而stopPropagation跟cancelBubble只是阻止事件冒泡,并没有阻止

浏览器的默认动作。当我们希望阻止事件冒泡的同时,也阻止浏览器的默认动作时,就可以2者都一起使用,如下代码:

<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function (event) {
alert('点击了a');
console.log(event);
event.stopPropagation();
event.preventDefault();
});
</script>

效果是:只弹出‘点击了a’,并不跳转百度链接,也不弹出‘点击了li’。

四、最后的一个return false;

<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function () {
alert('点击了a');
return false;
});
</script>

执行效果:只弹出‘点击了a’,并不跳转百度链接,也不弹出‘点击了li’。跟(stopPropagation+preventDefault)是一个效果。

退出执行, return false 之后的所有触发事件和动作都不会被执行. 有时候 return false 可以用来替代stopPropagation() 和

preventDefault(), 比如上面的例子。

值得注意的一点:有人认为 return false = stopPropagation() + preventDefault(),其实是错的。 return false 不但阻止事件,

还可以返回对象, 跳出循环等... 方便地一刀切而不够灵活, 滥用易出错。

贴一下本博客的html的代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件冒泡</title>
</head>
<body>
<ul>
<li>
<a href='#'>点击a</a>
</li>
</ul>
<script src="jquery-1.11.3.min.js"></script>
<script>
$('li').click(function () {
alert('点击了li');
});
$('a').click(function (event) {
alert('点击了a');
console.log(event);
event.stopPropagation();
// event.cancelBubble = true;
event.preventDefault();
// return false;
});
</script>
</body>
</html>

补充:谢谢博友指出,对于return false;我说明的比较少,其实return false并不是事件冒泡,本文讲的是跟事件冒泡有关的内容,return false在某种情况下也能实现。

因为return false不但阻止了事件,也阻止了浏览器的默认行为,就像一个终止符,也常常用它来阻止提交表单或者继续执行下面的代码,并且只在当前函数下

有用,return false执行了以下行为:

1、执行event.preventDefault();  阻止浏览器的默认行为;

2、event.stopPropagation();  阻止冒泡行为;

3、停止回调函数执行并立即返回。

写文章之前,我看到这样一句话:“cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他浏览器。”。我不

知道现在还是不是这样子,测试的时候兼容是好的,所以就没有说明这一点。当然,为了保险起见,博友帮我封了一个函数,感谢!文中不对之处还望指出,多多学习。

//阻止冒泡事件
function stopBubble(e){
if(e && e.stopPropagation){
// 非IE浏览器
e.stopPropagation();
}else{
//IE浏览器
window.event.cancelBubble=true;
}
}

同理,如果想阻止浏览器的默认事件

//阻止浏览器默认行为
function stopDefault(e){
//标准浏览器
if(e && e.preventDefault){
e.preventDefault();
}
//个别IE
else{
window.event.returnValue=fale;
return false;
}
}

js的stopPropagation()、cancelBubble、preventDefault()、return false的分析的更多相关文章

  1. 原生js中stopPropagation,preventDefault,return false的区别

    1.stopPropagation:阻止事件的冒泡,但不阻止事件的默认行为. 最好莫过于用例子说明: <div id='div'  onclick='alert("div") ...

  2. stopPropagation(), preventDefault() , return false 事件

    因为有父, 子节点同在, 因为有监听事件和浏览器默认动作之分. 使用 JavaScript 时为了达到预期效果经常需要阻止事件和动作执行. 一般我们会用到三种方法, 分别是 stopPropagati ...

  3. 【前端】stopPropagation, preventDefault, return false的区别

    e.stopPropagation()阻止事件冒泡或者捕获 因为事件可以在各层级的节点中传递, 不管是冒泡还是捕获, 有时我们希望事件在特定节点执行完之后不再传递, 可以使用事件对象的 stopPro ...

  4. event.stopPropagation()、event.preventDefault()与return false的区别

    做小demo时经常用到return false来取消默认事件,但一直不是很懂它和preventDefault()等的区别,今天查了查文档和大神们的博客,在这里对相关知识点做一个总结 首先开门见山,总结 ...

  5. jQuery js 中return false,e.preventDefault(),e.stopPropagation()的区别(事件冒泡)

    有时候遇到冒泡事件很烦人,真的..... 1.e.stopPropagation()阻止事件冒泡 <head> <title></title> <script ...

  6. preventDefault()、stopPropagation()、return false 的区别

    preventDefault() e.preventDefault()阻止浏览器默认事件 stopPropagation() e.stopPropagation()阻止冒泡 return false ...

  7. js中 return false

    一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  二.返回控制, 无函数结果,语法为:return;  在大多数情况下,为事件 ...

  8. js中return、return true、return false的区别

    一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  二.返回控制, 无函数结果,语法为:return;  在大多数情况下,为事件 ...

  9. js中return;、return true、return false;区别

    一.返回控制与函数结果, 语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果  二.返回控制, 无函数结果,语法为:return;  在大多数情况下,为事件 ...

随机推荐

  1. 体验phonegap3.0

    网上有各种各样的phonegap环境搭建资料,鉴于学习和整理的考虑,我还是把我搭建的过程整理出来 这篇文章中将涉及到的内容 PhoneGap环境需要的组件 Node环境 JDK Android SDK ...

  2. 【腾讯Bugly干货分享】让 CodeReview 这股清流再飞一会儿

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/ToYeT4Y4pzx0ii9Z92fo-Q 作者:刘 ...

  3. WPF - 属性系统 (1 of 4)

    本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码.但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的 ...

  4. Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)

    Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上) 网络嗅探,是监听流经本机网卡数据包的一种技术,嗅探器就是利用这种技术进行数据捕获和分析的软件. 编写嗅探器,捕获数据是前置功能, ...

  5. Btree 索引

    Btree 索引 索引是帮助数据库高效获取数据的一种数据结构,通过提取句子主干,就可以得到索引的本质. m-way查找树 如果想了解Btree,需要首先了解m-way数据结构. m-way查找树是是一 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (43) ------ 第八章 POCO之使用POCO加载实体

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-2  使用POCO加载关联实体 问题 你想使用POCO预先加载关联实体. 解决方 ...

  7. Java各种排序算法详解

    排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插 ...

  8. WPF MVVM下做发送短信小按钮

    最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录. 一.发送消息 没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一 ...

  9. .NET平台机器学习资源汇总,有你想要的么?

    接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分用过的 ,会有稍微详细点的说明,其他没用过的, ...

  10. Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)

    本节我们讨论 volume 的 Backup 操作. Backup 是将 volume 备份到别的地方(备份设备),将来可以通过 restore 操作恢复. Backup VS Snapshot 初看 ...