美文网首页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学习----父子元素点击事件冲突

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