2018年12月13日更新

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>ul li{border: 1px solid yellow;}</style>
</head>
<body>
<p hidden>This content is not relevant to this page right now, so should not be seen. Nothing to see here. Nada.</p>
<div id="ysr" style="border: 1px solid red;background-color: green;padding: 50px;"><ul id="ljl"><li id="1">aaaaaaaaa</li><li id="2">aaaaaaaaa</li><li id="3">aaaaaaaaa</li><li id="4">aaaaaaaaa</li><li id="5">aaaaaaaaa</li><li id="6">aaaaaaaaa</li><li id="7">aaaaaaaaa</li><li id="8">aaaaaaaaa</li><li id="9">aaaaaaaaa</li></ul>
</div>
<script>var ljl = document.getElementById('ljl');ljl.onclick = function (ev) {console.log(ev);console.log(ev.target);alert('in');ev.stopPropagation();};function doSth(){alert('---a---');}function doSth2(){alert('---ysr---');}ljl.addEventListener('click',doSth,true)var ysr = document.getElementById('ysr');ysr.addEventListener('click',doSth2,true)ysr.onclick = function (ev) {console.log(ev);console.log(ev.target);alert('in another');}</script>
</body>
</html>

  

----------------------------------------------------------------------------------------------------------------------------------------------------------

首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的。什么是事件冒泡?

什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层。这时,从最底层冒出了一个气泡,气泡会一层一层地上升,直到最顶层。而你不管在水的哪一层观察都可以看到并捕捉到这个气泡。好了,把“水”改成“DOM”,把“气泡”改成“事件”。这就是“事件冒泡”

什么是事件委托呢?event delegation : 地址:http://davidwalsh.name/event-delegate

One of the hot methodologies in the JavaScript world is event delegation, and for good reason.  Event delegation allows you to avoid adding event listeners to specific nodes;  instead, the event listener is added to one parent.  That event listener analyzes bubbled events to find a match on child elements.  The base concept is fairly simple but many people don't understand just how event delegation works.  Let me explain the how event delegation works and provide pure JavaScript example of basic event delegation.

下面是我在csdn找到的一篇解释,写的不错。原文地址:http://blog.csdn.net/iefreer/article/details/8573940

1、Event是什么?

event是用户操作网页时发生的交互动作,比如click/move, event除了用户触发的动作外,还可以是文档加载,窗口滚动和大小调整。

2、Event模型是什么?

Event模型指的是浏览器如何处理发生的事件。不同的浏览器其处理机制也不尽相同,甚至截然相反。

一般而言,某个界面元素发生单个事件,那么事件的处理对象就是该界面元素。

但一个典型的问题是如果该界面元素存在父子元素,而且父子元素也定义了同样的事件,

这个时候事件该如何处理呢,事件在父子元素之间是如何传递的呢,谁会先接收到这个事件,又是谁先处理呢?

举个例子:

-----------------------------------
| element1                        |
|   -------------------------     |
|   |element2               |     |
|   -------------------------     |
|                                 |
-----------------------------------

element2是element1的子元素,两者都定义了onclick事件。

这就是事件模型(事件序列)要解决的问题。

两种模型

回到网景和微软斗争的年代,两个公司选择了不同的道路:

网景选择的是事件捕获(event capturing)模型,即网景认为element1首先获取到事件;

微软选择了和其桌面系统类似的消息机制,认为element2有更高的优先权,即事件冒泡(event bubbling),

这两个模型截然相反,IE仅支持event bubbling. Mozilla, Opera 7等两种都支持. 更老版本的Opera和iCab两种都不支持。

你现在也许体会到了什么是互联网最初那最好也最坏的年代。

事件捕获

                   | |
--------------- | |-----------------
| element1      | |                |
|   -----------    | |-----------     |
|   |element2   \ /          |     |
|   -------------------------     |
|        Event CAPTURING          |
-----------------------------------

看上面箭头的方向,element1的事件处理器首先被触发,然后向下传递到element2

事件冒泡

                 / \
--------------| |-----------------
| element1   | |                |
|   ----------- | |-----------     |
|   |element2 | |          |     |
|   -------------------------     |
|        Event BUBBLING           |
-----------------------------------

与事件捕获相反,element2的事件处理器会首先被触发。

W3C模型

W3C非常理智的处理了这种差异,在两者之间采取了中和的方法,W3C模型规定任何事件首先会被捕获直到遇到目标元素,然后再向上返回。

                     | |  / \
-----------------| |--| |-----------------
| element1       | |  | |                |
|   ---------------| |--| |-----------     |
|   |element2    \ /   | |          |     |
|   --------------------------------     |
|        W3C event model                 |
------------------------------------------

WEB开发人员可以通过addEventListener()方法来选择在哪个阶段注册事件处理器(捕获阶段还是冒泡阶段),这个方法在Advanced models中有详细描述,其最后一个参数为true,则代表事件在捕获阶段被处理,false则代表事件在冒泡阶段被处理。

比如:

element1.addEventListener('click',doSomething2,true)
element2.addEventListener('click',doSomething,false)

事件首先被element1捕获,然后执行doSomething2,接着事件传递给element2,doSomething被执行,接着,事件冒泡回溯,检查是否有父元素(element1)定义了冒泡阶段的事件处理器,这里没有,所以事件终止。

兼容传统模型

在支持W3C DOM的浏览器中,传统的事件注册被看作是注册于冒泡阶段。

element1.onclick = doSomething2;————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————例子: 原地址:http://www.pureweber.com/article/event-delegation/
<html>
<head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><style>.white{background-color:#fff;}#d1{width:400px;height:400px;border:1px solid #000;margin:50px 50px;}#d2{width:300px;height:300px;border:1px solid #000;margin:50px 50px;}#d3{width:200px;height:200px;border:1px solid #000;margin:50px 50px;}#d4{width:100px;height:100px;border:1px solid #000;margin:50px 50px;}</style><script src="./lib/js/jquery-2.1.3.js"></script></head><body>
<div id="d1" class="white"><div id="d2" class="white"><div id="d3" class="white"><div id="d4" class="white"></div></div></div>
</div>
<button id="reset1">重置</button>
</body>
<script>$('#d4').bind('click', function(e){e.stopPropagation();alert('冒泡被阻止,这块将不会改变颜色');});jQuery('#d1').click(function(e){var t = jQuery(e.target);var id = t.attr('id');if (id==='d4'){t.css('background-color', 'yellow');} else if (id==='d3') {t.css('background-color', 'green');} else if (id==='d2') {t.css('background-color', 'blue');} else {t.css('background-color', 'red');}});jQuery('#reset1').click(function(){jQuery('.white').css('background-color', '#fff')});/*jQuery('#d4').click(function(){jQuery(this).css('background-color', 'yellow')});jQuery('#d3').click(function(){jQuery(this).css('background-color', 'green')});jQuery('#d2').click(function(){jQuery(this).css('background-color', 'blue')});jQuery('#d1').click(function(){jQuery(this).css('background-color', 'red')});jQuery('#reset1').click(function(){jQuery('.white').css('background-color', '#fff')});*/
</script>
</html>

  例子说明:注释的js 作用是显示出(事件冒泡和事件捕捉的):点击最小的那个,外面所有的都会被上色。你会发现,点击里层的正方形,外层所有的正方形都会被上色。因为它们也都捕捉到了点击事件。。未注释的是:修改上面的程序,使用事件委托来处理点击事件。  当最顶层捕获点击事件时,查看事件来源于哪一层,然后只将那一层涂色。再次点击每一层,查看实际效果。只有当前点击的正方形变色了,其他的都毫无反应。都“委托” 给了最顶层的那个div.当然,如果你有这样嵌套的页面元素,使用了事件委托,委托到了最顶层,这时需要注意:如果其中某个元素,你不希望它的事件冒泡,那么可以使用某种方式阻止事件的冒泡。在jQuery框架中,可以使用stopPropagation()方法来实现而不必关心浏览器兼容性。

事件委托的用途:事件委托是事件冒泡的一个应用,可以减少绑定元素的个数,也不必担心子节点被替换后可能需要进行重新的事件绑定。因为事件的捕获和后续代码的执行已经完全委托给了其父节点。如果页面中含有大量元素需要绑定事件,这样做会减少事件绑定数量,为浏览器减负,无疑会提高页面性能。

转载于:https://www.cnblogs.com/oxspirt/p/4446564.html

javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。...相关推荐

  1. 微信小程序阻止冒泡点击_微信小程序bindtap事件与冒泡阻止详解

    bindtap就是点击事件 在.wxml文件绑定: cilck here 在一个组件的属性上添加bindtap并赋予一个值(一个函数名) 当点击该组件时, 会触发相应的函数执行 在后台.js文件中定义 ...

  2. javascript的阻止默认事件和阻止冒泡事件

    这两个方面的知识,在妙味课堂中有听过,再次复习一下: 原文来自:[http://www.cnblogs.com/Essence/p/4266618.html] 事件冒泡与默认行为 在说事件冒泡之前,我 ...

  3. js 停止事件冒泡 阻止浏览器的默认行为

    在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到"停止事件冒泡"和"阻止浏览器默认行为". 浏览器默认行为: 在form中按回车键就会提交表单:单击鼠标 ...

  4. js阻止子元素事件_JS阻止冒泡和取消默认事件(默认行为)-前端开发博客

    js冒泡和捕获是事件的两种行为,使用event.stopPropagation()起到阻止捕获和冒泡阶段中当前事件的进一步传播.使用event.preventDefault()可以取消默认事件.对于冒 ...

  5. React 在body上绑定事件以及阻止事件冒泡

    <!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>R ...

  6. js添加事件、移除事件、阻止冒泡、阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 转载...

    js添加事件.移除事件.阻止冒泡.阻止浏览器默认行为等写法(兼容IE/FF/CHROME) 网上有关这方面的代码比较多而乱,这里整理一下并加以改进. 添加事件 01    var addEvent = ...

  7. js阻止子元素事件_阻止 JS 的冒泡事件

    用了一段时间google inbox,赶脚mail task的样式很酷炫,于是也模仿着做了一个task管理系统. Google task有个behavior是点击页面别处,当前展开的mail就会收起. ...

  8. jquery 阻止冒泡事件和阻止默认事件

    jQuery 冒泡和默认事件: <!DOCTYPE html> <html lang="en"> <head><meta charset= ...

  9. react 八千字长文深入了解react合成事件底层原理,原生事件中阻止冒泡是否会阻塞合成事件?

    壹 ❀ 引 在前面两篇文章中,我们花了较大的篇幅介绍react的setState方法,在介绍setState同步异步时提到,在react合成事件中react对于this.state更新都是异步,但在原 ...

最新文章

  1. 如何通过代码连接SQL Server数据库
  2. 半导体基础知识(2):PN结二极管和二极管特性
  3. “另一个程序正在使用此文件,进程无法访问”的解决方法
  4. 用于主题检测的临时日志(d94169f9-f1c0-45a2-82d4-6edc4bd35539 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...
  5. 怎样调整XenServer下面Linux虚拟机的磁盘大小
  6. 你必须知道的28个HTML5特征、窍门和技术
  7. 2n皇后 - 回溯
  8. 原生ajax请求及readyState的几种状态
  9. C++ struct和class的区别
  10. xml-apis-ext.jar
  11. MJRefresh上拉刷新下拉加载
  12. java post 注册_利用JAVA发送POST请求(垃圾注册就是这么产生的) | 学步园
  13. spring-boot报错循环注入报错:has been injected into other beans
  14. C++ 从入门到入土(English Version)Section5: Real numbers + bitwise operations
  15. VMware Cloud Director 10.4 发布 (含下载) - 云计算调配和管理平台
  16. oracle的临时表
  17. win10 手动设置 DNS 地址
  18. Genesis公链加速区块链行业发展
  19. esphome自制红外遥控器接入HA,用来控制灯光,开关等,可使用任意遥控控制
  20. 架构升级、性能优化,高德技术专家 infoQ 全球架构师峰会开讲啦

热门文章

  1. html 地址 点击召唤高德,高德地图api 点聚合+海量点+点击事件(根据地区或坐标进行定位)...
  2. 我的世界服务器防挂系统,[管理|机制]AFKKicker —— 防挂机!定时要求输入验证码 防止挂机[1.7.10-1.12.2]...
  3. 东莞理工c语言作业,东莞理工学院 c语言复习题
  4. C/C++二叉树前序遍历,中序遍历,后序遍历
  5. python绘制如下图形、小三角形边长20_python二级操作题与分析(7)
  6. java语言sql接口_Java语言SQL接口
  7. python include的功能_在Python的Config中增加Include功能
  8. matlab时域分析论文,基于Matlab语言的数字信号时域相关性研究与分析.doc
  9. android中svn插件安装,AndroidSDK安装SVN插件问题解决
  10. 类似endnote_求推荐一款文献管理软件?