CodeGym /课程 /Frontend SELF ZH /事件冒泡和捕获

事件冒泡和捕获

Frontend SELF ZH
第 42 级 , 课程 1
可用

7.1 Event Bubbling (事件冒泡)

在 JavaScript 中,发生在一个元素上的事件可以传播到 DOM 树中。这一过程称为事件传播,包含两种主要机制:事件冒泡 (event bubbling)事件捕获 (event capturing)

事件传播机制:

  1. Event Bubbling (事件冒泡)。
  2. Event Capturing (事件捕获)。

事件冒泡 是一个过程,在该过程中,发生在子元素上的事件会依次向上传播到根元素(通常是 document)。

解释:

  • 当按下按钮 child 时,首先触发 child 元素上的事件处理器 (Child clicked)
  • 然后事件冒泡到 parent 元素,并触发其处理器 (Parent clicked)

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Event Bubbling Example</title>
        </head>
        <body>
          <div id="parent">
            <button id="child">Click Me</button>
          </div>
          <script>
            const parent = document.getElementById('parent');
            const child = document.getElementById('child');

            parent.addEventListener('click', function(event) {
              console.log('Parent clicked');
            });

            child.addEventListener('click', function(event) {
              console.log('Child clicked');
            });
          </script>
        </body>
      </html>
    
  

7.2 Event Capturing (事件捕获)

事件捕获 是一个过程,事件从根元素开始向下传播到发生事件的目标元素。

要使用事件捕获,需要在添加事件处理器时将 capture 参数设置为 true

解释:

  • 当按下按钮 child 时,由于设置了 capture 参数为 true,首先触发 parent 元素上的事件处理器 (Parent clicked)
  • 然后事件到达目标元素 child,并触发其处理器 (Child clicked)

例子:

HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Event Capturing Example</title>
        </head>
        <body>
          <div id="parent">
            <button id="child">Click Me</button>
          </div>
          <script>
            const parent = document.getElementById('parent');
            const child = document.getElementById('child');

            parent.addEventListener('click', function(event) {
              console.log('Parent clicked');
            }, true);

            child.addEventListener('click', function(event) {
              console.log('Child clicked');
            });
          </script>
        </body>
      </html>
    
  

7.3 事件传播的三阶段模型

在 DOM 中处理事件涉及三个阶段:

1. Capturing Phase (捕获阶段)。事件从根元素(通常是 document)向下传播到目标元素。

2. Target Phase (目标阶段)。事件到达发生事件的目标元素。

3. Bubbling Phase (冒泡阶段)。事件从目标元素向上传播到根元素。

事件传播控制

有一些方法可以管理事件传播:

  1. stopPropagation()。阻止事件在冒泡和捕获阶段的进一步传播。
  2. stopImmediatePropagation()。阻止事件的进一步传播并阻止当前元素上的其他事件处理器的执行。
  3. preventDefault()。取消与事件关联的默认行为(例如,点击按钮时表单提交)。

7.4 使用 stopPropagation 的例子

解释:

  • 当按下按钮 child 时,触发 child 元素上的事件处理器 (Child clicked)
  • 使用 event.stopPropagation() 阻止事件冒泡,并且不触发 parent 元素上的事件处理器
HTML
    
      <!DOCTYPE html>
      <html>
        <head>
          <title>Stop Propagation Example</title>
        </head>
        <body>
          <div id="parent">
            <button id="child">Click Me</button>
          </div>
          <script>
            const parent = document.getElementById('parent');
            const child = document.getElementById('child');

            parent.addEventListener('click', function(event) {
              console.log('Parent clicked');
            });

            child.addEventListener('click', function(event) {
              console.log('Child clicked');
              event.stopPropagation(); // 阻止事件冒泡
            });
          </script>
        </body>
      </html>
    
  
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION