美文网首页
JavaScript中的事件冒泡和事件捕获

JavaScript中的事件冒泡和事件捕获

作者: 魂斗驴 | 来源:发表于2021-04-02 09:31 被阅读0次

    事件冒泡事件捕获是JavaScript中最常用的术语。在JavaScript中,事件流过程由三个概念完成:

    1. 事件捕获。
    2. 事件目标。
    3. 事件冒泡。

    事件 Event:

    事件负责JavaScript与HTML网页的交互。事件的一般定义是某人可以发生的任何行为。在Web开发中,事件的定义也相同。侦听器可以订阅事件,只有在可以触发特定事件时,事件才会发生。

    事件的基本示例是单击按钮

    事件流 Event Flow :

    事件流网页接收事件的顺序。如果在目标元素上执行单击之前,单击嵌套在其他元素上的div或button之类的元素。它必须首先触发其每个父元素的click事件,并从全局window对象的顶部开始。默认情况下,HTML的每个元素都是window对象的子级。

    事件流的历史:

    在第四代Web浏览器大战中,主要的浏览器社区,IE 4网景 4相互聚在一起,以寻找事件流方式的解决方案。基本上,两个开发团队都开会,讨论哪种方法更适合事件流。有两种方法从上到下(事件捕获) 另一个是 从下到上(事件冒泡)。但不幸的是,它们两者都采用相反的方法。IE 4采用事件冒泡方法,网景通讯器4采用事件捕获方法

    事件冒泡:

    事件冒泡是指事件从最深层的元素或目标元素到其父元素,然后是其所有由下而上的祖先 开始的事件。当前,所有现代浏览器都将事件冒泡作为事件流的默认方式。

    考虑有关事件冒泡的示例:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>Event Bubbling</title>
    </head>
    <body>
      <div id="parent">
        <button id="child">Child</button>
      </div>
      
      <script>
        var parent = document.querySelector('#parent');
        <!-- Add click event on parent div -->
          parent.addEventListener('click', function(){
            console.log("Parent clicked");
          });
    
        var child = document.querySelector('#child');
        <!-- Add click event on child button -->
          child.addEventListener('click', function(){
            console.log("Child clicked");
          });
      </script>
    </body>
    </html>
    

    事件冒泡

    事件冒泡的运行示例

    代码说明:

    1. 在上面的代码中,我们可以使用一行HTML代码和JavaScript代码创建一个html文件。
    2. 在HTML中,我们可以创建一个ID为parent的div。及其带有id子元素的嵌套按钮元素。
    3. 在Javascript代码中,首先我们可以借助document.querySelector()函数将html元素分配给变量
    4. 之后,我们可以附加一个click事件到父div和子按钮。和这两个函数都只是使用来在控制台上打印字符串值console.log()
    5. 当我们单击按钮时,首先运行button上附加的功能,然后onclick()运行div的功能。这是由于事件冒泡。首先运行与事件目标关联的事件,然后运行其父项进行window反对。

    当您单击按钮时,事件从内部事件目标(其ID为孩子的按钮)传递到文档。点击事件传递按以下顺序进行:

    1. <button>
    2. <div>
    3. <body>
    4. <html>
    5. document

    停止事件冒泡:

    如果要停止事件冒泡,可以使用event.stopPropagation()方法来实现。如果要停止从事件目标到DOM中顶部元素的事件流,则event.stopPropagation()method停止事件以从下到上传播。

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>Event Bubbling</title>
    </head>
    <body>
      <div id="parent">
        <button id="child" onclick="event.stopPropagation()">Child</button>
      </div>
      
      <script>
        var parent = document.querySelector('#parent');
        <!-- Add click event on parent div -->
          parent.addEventListener('click', function(){
            console.log("Parent clicked");
          });
        var child = document.querySelector('#child');
        <!-- Add click event on child button -->
          child.addEventListener('click', function(){
            console.log("Child clicked");
          });
      </script>
    </body>
    </html>
    

    停止事件冒泡

    代码说明:

    1. 在上面的代码中,我们可以使用一行HTML代码和JavaScript代码创建一个html文件。
    2. 在HTML中,我们可以创建一个ID为parent的div。及其带有id子元素的嵌套按钮元素。
    3. 在Javascript代码中,首先我们可以借助document.querySelector()函数将html元素分配给变量
    4. 之后,我们可以附加一个click事件到父div和子按钮。和这两个函数都只是使用来在控制台上打印字符串值console.log()
    5. 另一任务是,我们可以附加event.stopPropagation()来停止事件冒泡。在此代码中,我们可以添加event.stopPropagation()带有按钮以停止onclick事件从下到上的传播。因此,当我们单击按钮控制台时,仅打印“子级单击”。事件未从事件目标传递到网页文档。

    事件捕获:

    事件捕获是事件从顶部元素到目标元素的开始。现代浏览器默认情况下不支持事件捕获,但是我们可以通过JavaScript中的代码来实现。

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>Event Capturing</title>
    </head>
    <body>
      <div id="parent">
        <button id="child">Child</button>
      </div>
      
      <script>
        var parent = document.querySelector('#parent');
        var child = document.querySelector('#child');
    
        parent.addEventListener('click', function(){
          console.log("Parent clicked");
        },true);
    
    
        child.addEventListener('click', function(){
          console.log("Child clicked");
        });
      </script>
    </body>
    </html>
    

    事件捕捉

    事件捕捉

    代码说明:

    1. 在上面的代码中,我们可以使用一行HTML代码和JavaScript代码创建一个html文件。
    2. 在HTML中,我们可以创建一个ID为parent的div。及其带有id子元素的嵌套按钮元素。
    3. 在Javascript代码中,首先我们可以借助document.querySelector()函数将html元素分配给变量
    4. 之后,我们可以附加一个click事件到父div和子按钮。和这两个函数都只是使用来在控制台上打印字符串值console.log()
    5. 我们可以使用addEventListner的第三个可选参数将true设置为启用父div中的事件捕获。
    6. 当我们单击按钮时,首先运行div附带的函数,然后运行按钮的onclick函数。这是由于事件捕获。首先运行与父元素关联的事件,然后运行事件目标。

    当您单击按钮时,事件从父项(文档)传递到事件目标(ID为子项的按钮)。点击事件传递按以下顺序进行:

    1. document
    2. <html>
    3. <body>
    4. <div>
    5. <button>

    事件流的完整视图:

    每个事件流都分为三个阶段:

    1. 事件捕捉
    2. 活动目标
    3. 事件冒泡。

    在事件流中,事件目标有两个阶段,一个阶段是在事件捕获结束和事件冒泡开始时。

    结论 :

    事件冒泡和事件捕获是JavaScript中事件处理程序和事件委托的基础。在本文中,我们可以提供事件冒泡和事件捕获的概念性知识。

    参考

    Event Bubbling and Event Capturing in JavaScript

    相关文章

      网友评论

          本文标题:JavaScript中的事件冒泡和事件捕获

          本文链接:https://www.haomeiwen.com/subject/jqathltx.html