事件流描述的是从页面中接受事件的顺序,但有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两个截然相反的事件流概念,IE的事件流是事件冒泡流(event bubbling),而Netscape的事件流是事件捕获流(event capturing)

事件冒泡

IE提出的事件流叫做事件冒泡,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(从具体到不具体)
image.png

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body onclick="bodyClick()">
  8. <div onclick="divClick()">
  9. <button onclick="btn()">
  10. <p onclick="p()">点击冒泡</p>
  11. </button>
  12. </div>
  13. <script>
  14. function p(){
  15. console.log('p标签被点击')
  16. }
  17. function btn(){
  18. console.log("button被点击")
  19. }
  20. function divClick(event){
  21. console.log('div被点击');
  22. }
  23. function bodyClick(){
  24. console.log('body被点击')
  25. }
  26. </script>
  27. </body>
  28. </html>

事件捕获

事件捕获流的思想是不太具体的DOM节点应该更早接收到事件,而最具体的节点应该最后接收到事件(从不具体到具体)
image.png
⚠️注意:事件捕获只采用DOM2级事件处理程序
事件捕获:DOM2级事件处理。addEventListener(“type” , callback , boolean)
boolean:

  • true:事件捕获
  • false:默认值是false,代表事件冒泡
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <div>
    9. <button>
    10. <p>点击捕获</p>
    11. </button>
    12. </div>
    13. <script>
    14. var oP=document.querySelector('p');
    15. var oB=document.querySelector('button');
    16. var oD=document.querySelector('div');
    17. var oBody=document.querySelector('body');
    18. oP.addEventListener('click',function(){
    19. console.log('p标签被点击')
    20. },true);
    21. oB.addEventListener('click',function(){
    22. console.log("button被点击")
    23. },true);
    24. oD.addEventListener('click', function(){
    25. console.log('div被点击')
    26. },true);
    27. oBody.addEventListener('click',function(){
    28. console.log('body被点击')
    29. },true);
    30. </script>
    31. </body>
    32. </html>