进一步理解事件修饰符“.capture”

阅读: 评论:0

进一步理解事件修饰符“.capture”

进一步理解事件修饰符“.capture”

1DOM事件的传播机制

DOM的事件传播机制有两个阶段:一个是捕获阶段,一个是冒泡阶段。捕获阶段是从外到内,冒泡阶段是从内到外。举例来说,假如有如下的两个嵌套在一起的<div>,如下所示:

<div>

  这是外层的div

  <div>

      这是内层的div

  </div>

</div>

如果我们分别内层和外层的<div>定义了捕获阶段和冒泡阶段的点击事件的事件处理方法,那么我们是可以看到其完整的执行顺序的。其执行顺序如下:

    (1)外层<div>的捕获阶段的处理方法被执行;

    (2)内层<div>的捕获阶段的处理方法被执行;

    (3)内层<div>的冒泡阶段的处理方法被执行;

    (4)外层<div>的冒泡阶段的处理方法被执行;

Vue 默认的v-on绑定的事件处理方法是冒泡阶段的事件处理方法,不是捕获阶段的事件处理方法。请参见下面的代码:

<template>

  <div @click="outerDivClick">

    这是外层的div,你可以点击我

    <div @click="innerDivClick">

        这是内层的div,你可以点击我

    </div>

  </div>

  <p>{{str}}</p>

</template>

<script>

import { reactive, toRefs } from 'vue'

export default {

  setup () {

    const state = reactive({

      str: '这里显示执行结果:'

    })

    const outerDivClick = () => {

      state.str += '外层的事件处理函数被执行'

    }

    const innerDivClick = () => {

      state.str += '内层的事件处理函数被执行'

    }

    return {

      ...toRefs(state),

      outerDivClick,

      innerDivClick,

    };

  },

};

</script>

 图1嵌套的<div>

这段代码在浏览器中看到的效果如图2所示。当我们点击外层<div>时,外层是target,即此时的最内层,因为vue绑定的事件默认的冒泡阶段的,所以并没有定义外层<div>的捕获阶段的事件处理方法,所以只有外层<div>的冒泡阶段的事件处理方法outerDivClick被执行。所以我们点击外层的<div>里的文字“这是外层的div,你可以点击我”时,看到的输出如图3所示:

 图2 外层<div>被点击

当我们点击内层<div>时,内层是target,即此时的最内层,同理,vue绑定的事件默认的冒泡阶段的,所以并没有定义外层<div>的捕获阶段的事件处理方法,也没有定义内层<div>的捕获阶段的事件处理方法,所以只有冒泡阶段的事件处理方法被执行。又因为外层和内层<div>的冒泡阶段的事件处理方法都被定义了,即outerDivClick和innerDivClick两个都是冒泡阶段的事件处理方法,所以这两个都要被执行。其顺序是先内后外,所以我们点击内层的<div>里的文字“这是内层的div,你可以点击我”时,看到的输出如图4所示:

图4 内层<div>被点击 

2、“.capture”事件修饰符的作用

 如果我们在事件绑定时想绑定捕获阶段的事件处理方法,就可以使用“.capture”修饰符。加了“.capture” 修饰符之后,该事件处理方法是捕获阶段的事件处理方法了。例如,我们给外层的<div>的v-on指令加上“.capture”修饰符,此时,外层的事件处理方法是捕获阶段的,内层的还是冒泡阶段的。上面的代码修改如下:

<template>

  <div @click.capture="outerDivClick">

    这是外层的div,你可以点击我

    <div @click="innerDivClick">

        这是内层的div,你可以点击我

    </div>

  </div>

  <p>{{str}}</p>

</template>

此时,点击外层的<div>,外层的捕获阶段的事件处理方法被执行。其结果如图4所示:

图4 外层<div>被点击 

点击内层<div>,外层<div>的捕获阶段的事件处理方法先被执行,内层<div>的冒泡阶段的事件处理方法后被执行,其执行结果如图5所示:

图5 内层<div>被点击 

思考:如果我们给内外两层<div>的v-on指令都加上“.capture”修饰符,那么点击外层或点击内层的输出会是什么样子?

此时,如果我们给内外层<div>的v-on指令都加上“.capture”修饰符,那么两个处理方法将都被定义为捕获阶段的事件处理方法,点击外层时,依然是只有外层的捕获处理方法会被执行。点击内层时,两个捕获阶段的事件处理方法都会被执行,执行顺序是先外后内。

本文发布于:2024-01-30 19:24:37,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170661388022274.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:【obs
标签:事件   修饰符   capture
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23