出現場景:
頁面有一個輸入框A綁定了blur事件澄暮,且這個事件里面需要用到ajax請求數據蝌以,然后有一個按鈕B綁定了點擊事件糊啡;
在A里面輸入完信息后, 還沒失去焦點的時候點擊B豪娜,這個時候發(fā)現只執(zhí)行了A的blur事件餐胀,而B的click事件沒有觸發(fā)。(ps: 若blur事件 僅僅只是普通操作瘤载,沒有ajax異步請求的話 是沒問題的)
<el-button @click="clickTest">失焦點擊測試</el-button>
<el-input @blur="blurTest" placeholder="失焦點擊測試"></el-input>
// -----------------------
clickTest(){
console.log('clickTest');
},
blurTest(){
console.log('blurTest');
}
// -----------------------
// 結果正常:
// blurTest
// clickTest
blurTest(){
console.log('blurTest');
this.$ajax.get('/test')
.then(res=>{
console.log('blur請求完成')
})
}
// 結果:(不會執(zhí)行點擊事件)
// blurTest
// blur請求完成
網上搜到的三種解決辦法,(個人覺得都不適合):
1.blur事件加延時否灾,讓click先執(zhí)行,缺點:click事件雖然執(zhí)行了惕虑,但是在blur請求完成前執(zhí)行的坟冲,不能獲取到blur請求后的最新數據(pass)
2.給按鈕B加個mousedown磨镶,并在mousedown里面阻止默認事件e.preventDefault()
溃蔫,因為mousedown會優(yōu)先于blur事件。缺點:這樣點擊事件會執(zhí)行琳猫,但是blur事件不會觸發(fā)(pass)
另外伟叛,若是在vue ui框架element-ui上的標簽加事件,@mousedown需要加上.native關鍵字脐嫂,不然不會觸發(fā)
3.按鈕B上的點擊事件換成mousedown事件统刮,這樣兩者都會執(zhí)行,但是mousedown(原click)先執(zhí)行账千,類似第一種加延時處理侥蒙。缺點:除了第一點說的,mousedown事件會在鼠標按下去的一瞬間執(zhí)行匀奏,不是很友好鞭衩。(pass)
發(fā)現上面三種都不好用,于是本人想到娃善,能不能在點擊的時候獲取到鼠標點了誰论衍,如果被點擊的元素有click事件,再在blur的回調函數里面執(zhí)行(以下方法若有不合適的地方聚磺,希望給與指出)
clickTest(){
console.log('clickTest');
this.$ajax.get('/test')
.then(res=>{
console.log('click請求完成')
})
},
blurTest(){
console.log('blurTest');
this.$ajax.get('/test')
.then(res=>{
console.log('blur請求完成')
if(arguments[0] && arguments[0].relatedTarget && arguments[0].relatedTarget.click){
arguments[0].relatedTarget.click();
}
})
},
// -----------------------------
// 結果OK:
// blurTest
// blur請求完成
// clickTest
// click請求完成