event事件对象有三种易混淆的方法,本文讲述他们之间的区别:

  • Event.preventDefault()
  • Event.stopPropagation()
  • Event.stopImmediatePropagation()

综述

首先,我们看看他们在MDN上的介绍:

  • preventDefault: 如果当前event.cancelable属性为true,则取消的当前事件的默认动作,但不阻止当前事件的进一步传播
  • stopPropagation: 阻止当前冒泡或捕获阶段的进一步传播
  • stopImmediatePropagation: 阻止调用相同事件的其他监听器

Event.preventDefault

我们来看一个代码示例,当点击一个form中的submit按钮时会将form提交处理,此时如果使用Event.preventDefault,就可以在点击submit按钮时避免表格提交。

<form id="myForm" action="/my-handling-form-page" method="post"><div><label for="name">姓名:</label><input type="text" id="name" /></div><div><label for="mail">电子邮箱:</label><input type="email" id="mail" /></div><div><label for="msg">消息:</label><textarea id="msg"></textarea></div><div class="button"><button type="submit">发送你的消息</button></div>
</form>
$('#myForm').on('submit', function(e) {e.preventDefault(); // 什么都不会发生
});

Event.preventDefault能确保表格不会被提交,但他不能阻止来自冒泡阶段的submit或点击事件,其他两种方法就是解决这个问题的。

Event.stopPropagation

stopPropagation 保证当前事件不再进一步冒泡,通过以下代码示例说明:

<div class="container"><a href="#" class="element">点击我!</a>
</div>
$('.container').on('click', function(e) {console.log('container 被点击了');
});$('.element').on('click', function(e) {e.preventDefault(); // 此时链接不会跳转console.log('element 被点击了');
});

此时点击链接,console会显示:

"element was clicked"
"container was clicked"

这时如果添加Event.stopPropagation:

$('.container').on('click', function(e) {console.log('container 被点击了');
});$('.element').on('click', function(e) {e.preventDefault(); // 此时链接不会跳转e.stopPropagation(); // 此时事件冒泡被阻止console.log('element 被点击了');
});

再次点击链接,会看到:

"element 被点击了"

Event.stopImmediatePropagation

以上两种方法已经可以解决我们在事件处理中90%的问题,接下来介绍一种无法解决情形。
同样是使用上面的示例,但这次我们给<a/>添加2个class,一个是被所有<a/>共享的class: item,另一个是独有的class: element,假设这两个class对当前网站的功能很重要。

<div class="container"><a href="#" class="item element">Click Me!</a>
</div>

我们首先使用之前提到的Event.stopPropagation

$('.item').on('click', function(e) {console.log('item 被点击了');
});$('.element').on('click', function(e) {e.preventDefault(); // 此时链接不会跳转e.stopPropagation(); // 此时事件冒泡被阻止console.log('element 被点击了');
});

当我们点击<a/>时,将会显示:

"item 被点击了"
"element 被点击了"

这个现象会发生是因为item与element在DOM中是被平等对待的,与之前<a/>被点击然后冒泡到父级div不同,这次我们点击同时触发了item与element的事件,此时使用stopPropagation无法阻止这种事件。

stopImmediatePropagation登场~

$('.element').on('click', function(e) {e.preventDefault(); // 此时链接不会跳转e.stopImmediatePropagation(); // item的点击事件将被阻止console.log('element 被点击了');
});$('.item').on('click', function(e) {console.log('item 被点击了');
});

这里我们要注意的一点是:stopImmediatePropagation的代码要尽量放到其他同级竞争事件代码的上面,如上面的例子中,为了使stopImmediatePropagation起作用,我们将element的事件监听代码放到了item之前!

运行最后一例中的代码,将只会看到:

"element 被点击了"

preventDefault, stopPropagation, stopImmediatePropagation 三者的区别相关推荐

  1. 事件冒泡 bubbles cancelBubble stopPropagation() stopImmediatePropagation() 区别

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>事件冒 ...

  2. stopPropagation和cancelBubble的区别

    首先,总结一下DOM中的事件对象:(符合W3C标准) preventDefault()     取消事件默认行为 stopImmediatePropagation()   取消事件冒泡同时阻止当前节点 ...

  3. 我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)...

    我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等) 转载于:https://www.cnblogs.com/Totooria-Hyperion/p/5260289.htm ...

  4. 学习数据科学、机器学习与AI没有多大交集,一文告诉你三者最大区别

    翻译 | AI科技大本营 参与 | Shawn 编辑 | Donna [AI科技大本营导读]我们常常提及数据科学.机器学习和人工智能,也有一个整体的概念.但是,如果要清晰地说出三者的定义分别是什么,区 ...

  5. C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

    C++ 在继承中虚函数.纯虚函数.普通函数,三者的区别 1.虚函数(impure virtual) C++的虚函数主要作用是"运行时多态",父类中提供虚函数的实现,为子类提供默认的 ...

  6. 【c++】27.事件驱动、IO复用、sellect、poll、epoll三者的区别

    一.事件驱动的理解: 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在 ...

  7. 转 框架页有Frame、Iframe、Frameset 3个标记,初学者容易将三者混淆,下面分别讲解三者的区别。...

    框架页有Frame.Iframe.Frameset 3个标记,初学者容易将三者混淆,下面分别讲解三者的区别. 10.4.1  Frameset与Frame的区别 首先讲解Frameset与Frame之 ...

  8. Java基础之String,StringBuilder,StringBuffer三者的区别

    Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...

  9. mysql点击execute_MySQL execute、executeUpdate、executeQuery三者的区别

    execute.executeUpdate.executeQuery三者的区别(及返回值) 一.boolean execute(String sql) 允许执行查询语句.更新语句.DDL语句. 返回值 ...

最新文章

  1. 函数声明末尾的“ const”是什么意思? [重复]
  2. 箱形图适用于哪种数据_盘点 | 十分钟进阶Excel数据可视化
  3. android手机微信收藏功能实现,Android模仿微信收藏文件的标签处理功能
  4. Java8 stream().map()将对象转换为其他对象
  5. 信息学奥赛一本通(1330:【例8.3】最少步数)
  6. 最简单的基于FFmpeg的AVfilter例子(水印叠加)
  7. 涉嫌内幕交易?美国SEC对马斯克展开调查
  8. Android 蓝牙开发(五)OPP接收文件
  9. CentOS 7操作系统中设置系统时间/时区的方法
  10. openlayers6【十三】地图矢量图层 Vector 详解
  11. 在MySQL中设计新闻网站_基于MySQL新闻搜索引擎的设计与实现
  12. 计算机 无法 访问共享网络打印机,共享打印机无法连接怎么办解决方案
  13. python自动化部署hadoop集群_大数据集群的自动化运维实现思路
  14. 微信开发,微信开发者平台
  15. PDF怎么合并?这些合并方法你该知道
  16. 数据包接收系列 — 数据包的接收过程(宏观整体)
  17. APNs苹果推送使用的是pushy框架+.p8证书(java后台)(附上与.p12的不同)
  18. mysql ansi nulls_SQL学习笔记之ANSI_NULLS
  19. 什么是换热器,换热器的种类有哪些QY-RG33
  20. canvas+vue实现图片的缩放、拖拽

热门文章

  1. hive报错(1)MoveTask
  2. Java网络编程从入门到精通(25):创建ServerSocket对象
  3. We change lives !
  4. 合理利用Java不可变对象,让你的代码更加优雅
  5. BZOJ1007:[HNOI2008]水平可见直线(计算几何)
  6. 买茶叶想到的哪个比较便宜 x1/y1 x2/y2 x代表多少钱 y代表 多少克 无聊的试炼...
  7. Web开发中的弹出对话框控件介绍
  8. Lvs+Keepalived高可用负载均衡配置
  9. openfire spark用户名问题续
  10. 全栈开发工程师微信小程序-上(中)