vue父元素點(diǎn)擊事件與子元素點(diǎn)擊事件沖突問題
父元素點(diǎn)擊事件與子元素點(diǎn)擊事件沖突
在做vue項(xiàng)目的時(shí)候,遇到子元素有點(diǎn)擊事件,父元素也有點(diǎn)擊事件,當(dāng)點(diǎn)擊子元素時(shí)往往觸發(fā)的是父元素的點(diǎn)擊事件,產(chǎn)生沖突,怎樣解決這個(gè)問題呢?
這就用到vue事件中的事件修飾符,官網(wǎng)地址
Vue.js 為 v-on 提供了事件修飾符 .stop、.prevent、.capture、.self、.once、.passive,我們要處理子元素與父元素的事件沖突就要阻止事件傳遞的產(chǎn)生,而事件修飾符 .stop 的作用是阻止事件繼續(xù)傳播,那么我們需要在子元素的事件上添加事件修實(shí)符 .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)聽器時(shí)使用事件捕獲模式 --> <!-- 即內(nèi)部元素觸發(fā)的事件先在此處理,然后才交由內(nèi)部元素進(jìn)行處理 --> <div v-on:click.capture="doThis">...</div> <!-- 只當(dāng)在 event.target 是當(dāng)前元素自身時(shí)觸發(fā)處理函數(shù) --> <!-- 即事件不是從內(nèi)部元素觸發(fā)的 --> <div v-on:click.self="doThat">...</div>
使用修飾符時(shí),順序很重要;相應(yīng)的代碼會(huì)以同樣的順序產(chǎn)生。
因此,用 v-on:click.prevent.self 會(huì)阻止所有的點(diǎn)擊,而 v-on:click.self.prevent 只會(huì)阻止對(duì)元素自身的點(diǎn)擊。(官網(wǎng)有介紹此段)
vue點(diǎn)擊事件(父子層級(jí)元素點(diǎn)擊時(shí)踩坑記錄)
<ul>
<li @click="fatherClick">
<div @click.stop="childClick">
</div>
</li>
</ul>var vm_target = new Vue({
el: '#vm_target',
data: {
},
methods:{
/**父元素點(diǎn)擊事件**/
fatherClick:function(event){
var el1 = event.currentTarget;
var el2 = event.target;
},<br> childClick:function(event){ <br> <br> }
},
created:function(){
}
}); 在JS中,event.currentTarget獲取到的是click事件綁定的DOM對(duì)象,event.target獲取到的為當(dāng)前所點(diǎn)擊的DOM對(duì)象。
若綁定了一個(gè)父級(jí)元素后,點(diǎn)擊子元素時(shí),會(huì)觸發(fā)父元素的點(diǎn)擊事件,若需要點(diǎn)擊子元素時(shí)不觸發(fā)父元素事件
有兩種方法:
1、在父元素中判斷event.currentTarget == event.target是否為true
editTarget:function(event){
? ? ? ?var el1 = event.currentTarget;
? ? ? ?var el2 = event.target;
? ? ? ?if(el1 == el2){
? ? ? ? ? //do something
? ? ? ?} ?
}2、在子元素中,綁定一個(gè)阻止冒泡的點(diǎn)擊事件 @click.stop
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3中使用keepAlive緩存路由組件不生效的問題解決
這篇文章主要介紹了vue3中使用keepAlive緩存路由組件不生效的問題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-06-06
vue中的rules表單校驗(yàn)規(guī)則使用方法示例詳解 :rules=“rules“
這篇文章主要介紹了vue中的rules表單校驗(yàn)規(guī)則使用方法示例詳解 :rules=“rules“,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
vue.config.js中devServer.proxy配置說明及配置正確不生效問題解決
Vue項(xiàng)目devServer.proxy代理配置詳解的是一個(gè)非常常見的需求,下面這篇文章主要給大家介紹了關(guān)于vue.config.js中devServer.proxy配置說明及配置正確不生效問題解決的相關(guān)資料,需要的朋友可以參考下2023-02-02
Vue基于localStorage存儲(chǔ)信息代碼實(shí)例
這篇文章主要介紹了Vue基于localStorage存儲(chǔ)信息代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Vue input輸入框回車以后自動(dòng)刷新頁面(直播程序)
這篇文章主要介紹了直播程序,Vue input輸入框回車以后自動(dòng)刷新頁面,適用場(chǎng)景是在輸入框輸入字符并按下回車鍵搜索時(shí),刷新頁面,需要的朋友參考下實(shí)現(xiàn)代碼2023-01-01
Vue系列:通過vue-router如何傳遞參數(shù)示例
本篇文章主要介紹了Vue系列:通過vue-router如何傳遞參數(shù)示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問題
這篇文章主要介紹了vue跳轉(zhuǎn)外部鏈接始終有l(wèi)ocalhost的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

