美文网首页VUE学习
VUE学习----父子元素点击事件冲突

VUE学习----父子元素点击事件冲突

作者: 扮猪老虎吃 | 来源:发表于2021-01-17 10:22 被阅读0次

背景

  在开发中,经常遇到父级元素带有点击事件,而其子级元素也有点击事件。且二者的具有不同的逻辑处理。在点击子级元素时,会触发父级元素的事件响应,带来不好的用户体验。

举例说明:
<template>
    <div @click="fatherClick" style="background-color: pink;">
      <div style="width: 100px; background: red; font-size: 0.32rem; margin: 10px 10px 10px 10px;">内容</div>
      <div @click="childClick" style="width: 200px; padding: 10px 10px; background-color: yellow; font-size: 0.4rem; margin: 10px 10px;">测试子元素</div>
    </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {}
  },
  methods: {
    fatherClick(event) {
      let el1 = event.currentTarget
      let el2 = event.target
      console.log('fatherClick=========')
      console.log(el1, 'currenrTarget from fatherClick')
      console.log(el2, 'target from fatherClick')
    },
    childClick(event) {
      let el1 = event.currentTarget
      let el2 = event.target
      console.log('childClick=========')
      console.log(el1, 'currenrTarget from childClick')
      console.log(el2, 'target from childClick')
    }
  }
}
</script>

页面效果如图所示。


屏幕截图 2021-01-17 194501.png
观察冲突现象

点击父元素区域和子元素区域,日志显示信息为:


父子层级元素点击冲突

根据日志显示,可看出,

在点击父级元素时,只触发父元素的点击事件,currentTarget和target都指向了父级元素对象
在点击子级元素时,先触发子元素的点击事件,后触发父元素的点击事件。currentTarget和target先都指向子级元素对象,然后currentTarget指向父级元素对象,taeget指向子级元素对象。

原因:

在JS中,

event.currentTarget获取到的是click事件绑定的DOM对象

event.target获取到的为当前所点击的DOM对象。

若绑定了一个父级元素后,点击子元素时,会触发父元素的点击事件。

若需要点击子元素时不触发父元素事件,有两种解决方案

1、在父元素中判断event.currentTarget == event.target是否为true

fatherClick(event) {
      let el1 = event.currentTarget
      let el2 = event.target
      if (el1 === el2) {
        console.log('-------选中了父元素------')
      }
    },

观察现象:


解决冲突方式(一)

2、在子元素中,绑定一个阻止冒泡的点击事件 @click.stop

<template>
    <div @click="fatherClick" style="background-color: pink;">
      <div style="width: 100px; background: red; font-size: 0.32rem; margin: 10px 10px 10px 10px;">内容</div>
      <div @click.stop="childClick" style="width: 200px; padding: 10px 10px; background-color: yellow; font-size: 0.4rem; margin: 10px 10px;">测试子元素</div>
    </div>
</template>

观察现象:


解决冲突方式(二)

相关文章

  • VUE学习----父子元素点击事件冲突

    背景   在开发中,经常遇到父级元素带有点击事件,而其子级元素也有点击事件。且二者的具有不同的逻辑处理。在点击子级...

  • 父子控件点击事件冲突

    子view: catchtap='' hover-stop-propagation='true' 父view: b...

  • vue 点击事件获取当前点击元素

    点击子元素,触发父元素方法。获取子元素属性

  • 2021-07-16

    Vue 语法中使用的 注意事项 在DOM中 可能存在 点击触发子元素事件,父元素事件也跟着响应了 (这叫...

  • vue事件修饰符

    js事件默认冒泡: 点击内层的元素会触发外层的事件。(解决方法如下:) 事件修饰符 vue提供了事件修饰符,...

  • Vue的组件通信

    Vue的父子通信问题 参考文档 : Vue 组件组合 使用 props传递数据 用v-on 绑定事件 原理: 父子...

  • js中的事件冒泡

    js中如果元素是父子关系,事件会产生冒泡现象,而且执行顺序是 从 子到爷如: 点击 3 执行效果是: 阻止事件冒泡...

  • 非父子组件通信

    对于非父子组件通信,可以使用一个空的Vue实例来作为中央事件线。 index.html index.js 点击 a...

  • vue 父子组件冲突

    @click.stop

  • zepto on绑定事件遇到的坑

    最近项目中有个卡片点击的需求,卡片有点击事件,卡片上的子元素也绑定点击事件,为了避免点击子元素冒泡,在子元素点击事...

网友评论

    本文标题:VUE学习----父子元素点击事件冲突

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