vue父元素點擊事件與子元素點擊事件沖突問題
父元素點擊事件與子元素點擊事件沖突
在做vue項目的時候,遇到子元素有點擊事件,父元素也有點擊事件,當(dāng)點擊子元素時往往觸發(fā)的是父元素的點擊事件,產(chǎn)生沖突,怎樣解決這個問題呢?
這就用到vue事件中的事件修飾符,官網(wǎng)地址
Vue.js 為 v-on 提供了事件修飾符 .stop、.prevent、.capture、.self、.once、.passive,我們要處理子元素與父元素的事件沖突就要阻止事件傳遞的產(chǎn)生,而事件修飾符 .stop 的作用是阻止事件繼續(xù)傳播,那么我們需要在子元素的事件上添加事件修實符 .stop 來阻止事件傳播。
如下代碼:
<!-- html --> <li class="settingImgLi" :class="{active:index==isActive}" v-for="(image,index) in data.consultList" :key="index" <!--父元素事件--> @click="handleCurrentItem(image,index)"> <div style="width:100%;height:100%;position: relative;overflow: hidden;"> <img width="100%" height="100%" :src="image.image" alt=""> <div class="img-item-selected"> <Icon type="md-checkmark" /> </div> </div> <!-- 子元素事件--> <div class="img-item-close" @click.stop="removePic(index)"> <i class="el-icon-circle-close"></i> </div> </li> <!-- js --> handleCurrentItem(image, index) { console.log("父元素") }, removePic(index){ console.log("子元素") },
事件修飾符
<!-- 阻止單擊事件繼續(xù)傳播 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件不再重載頁面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修飾符可以串聯(lián) --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修飾符 --> <form v-on:submit.prevent></form> <!-- 添加事件監(jiān)聽器時使用事件捕獲模式 --> <!-- 即內(nèi)部元素觸發(fā)的事件先在此處理,然后才交由內(nèi)部元素進行處理 --> <div v-on:click.capture="doThis">...</div> <!-- 只當(dāng)在 event.target 是當(dāng)前元素自身時觸發(fā)處理函數(shù) --> <!-- 即事件不是從內(nèi)部元素觸發(fā)的 --> <div v-on:click.self="doThat">...</div>
使用修飾符時,順序很重要;相應(yīng)的代碼會以同樣的順序產(chǎn)生。
因此,用 v-on:click.prevent.self 會阻止所有的點擊,而 v-on:click.self.prevent 只會阻止對元素自身的點擊。(官網(wǎng)有介紹此段)
vue點擊事件(父子層級元素點擊時踩坑記錄)
<ul> <li @click="fatherClick"> <div @click.stop="childClick"> </div> </li> </ul>
var vm_target = new Vue({ el: '#vm_target', data: { }, methods:{ /**父元素點擊事件**/ fatherClick:function(event){ var el1 = event.currentTarget; var el2 = event.target; },<br> childClick:function(event){ <br> <br> } }, created:function(){ } });
在JS中,event.currentTarget獲取到的是click事件綁定的DOM對象,event.target獲取到的為當(dāng)前所點擊的DOM對象。
若綁定了一個父級元素后,點擊子元素時,會觸發(fā)父元素的點擊事件,若需要點擊子元素時不觸發(fā)父元素事件
有兩種方法:
1、在父元素中判斷event.currentTarget == event.target是否為true
editTarget:function(event){ ? ? ? ?var el1 = event.currentTarget; ? ? ? ?var el2 = event.target; ? ? ? ?if(el1 == el2){ ? ? ? ? ? //do something ? ? ? ?} ? }
2、在子元素中,綁定一個阻止冒泡的點擊事件 @click.stop
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解vuex中的this.$store.dispatch方法
這篇文章主要介紹了vuex中的this.$store.dispatch方法,必須要用commit(‘SET_TOKEN’,?tokenV)調(diào)用mutations里的方法,才能在store存儲成功,需要的朋友可以參考下2022-11-11Vue移動端實現(xiàn)調(diào)用相機掃描二維碼或條形碼的全過程
最近在使用vue開發(fā)的h5移動端想要實現(xiàn)一個調(diào)用攝像頭掃描二維碼的功能,所以下面這篇文章主要給大家介紹了關(guān)于Vue移動端實現(xiàn)調(diào)用相機掃描二維碼或條形碼的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08一篇文章帶你吃透Vue生命周期(結(jié)合案例通俗易懂)
這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你吃透Vue生命周期,文章通過結(jié)合案例更加的通俗易懂,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02vue2.0數(shù)據(jù)雙向綁定與表單bootstrap+vue組件
這篇文章主要介紹了vue2.0數(shù)據(jù)雙向綁定與表單bootstrap+vue組件,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02