先看一个完整的演示页面代码。javascript
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>JavaScript addEventListener</title> <style> .header-container ul { padding: 40px; background-color: #eee; } .header-container li { padding: 20px; background-color: yellow; } </style> </head> <body> <header class="header-container" id="header"> <nav> <ul> <li><a href="#">nav ul li a</a></li> </ul> </nav> </header> <script> const header = document.getElementById('header'), ul = header.querySelector('ul'), li = header.querySelector('li'), useCapture = true; ul.addEventListener('click', function() { console.log(useCapture, 'ul'); }, useCapture); li.addEventListener('click', function() { console.log(useCapture, 'li'); }, useCapture); </script> </body> </html>
输出:html
true "ul" true "li"
输出:java
true "li" true "ul"
useCapture 可选
Boolean,是指在DOM树中,注册了该listener的元素,是否会先于它下方的任何事件目标,接收到该事件。沿着DOM树向上冒泡的事件不会触发被指定为use capture(也就是设为true)的listener。当一个元素嵌套了另外一个元素,两个元素都对同一个事件注册了一个处理函数时,所发生的事件冒泡和事件捕获是两种不一样的事件传播方式。事件传播模式决定了元素以哪一个顺序接收事件。进一步的解释能够查看 事件流 及 JavaScript Event order 文档。 若是没有指定, useCapture 默认为 false 。函数
useCapture 這個參數就是在控制這時候兩個 click 事件的先後順序。若是是 false ,那就會使用 bubbling,他是從內而外的流程,若是是 true,那就是 capture,和 bubbling 相反是由外而內。capture 和 bubbling,兩個檔案只有差在此一參數不一样,能够發現事件的發生順序不一樣了。.net
useCapture
参数默认为false
,事件执行顺序为 事件冒泡bubbling
(由内向外),即本示例中顺序是li → ul
;useCapture
值为true
,事件执行顺序为事件捕捉capturing
(由外向内),即本示例中顺序是ul → li
。scala
事件捕捉与冒泡:http://javascript.info/bubbling-and-capturingcode
https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
https://blog.othree.net/log/2007/02/06/third-argument-of-addeventlistener/htm
转载请注明出处:http://blog.givebest.cn/javascript/2017/08/01/javascript-addEventListener-third-parameter.htmlblog