解決VUE自定義拖拽指令時 onmouseup 與 click事件沖突問題
功能描述:


如圖,右側(cè)懸浮菜單按鈕,只支持上下方向拖動,點擊時展開或關(guān)閉菜單。
BUG說明:
鼠標(biāo)上下方向拖拽,如果松開時鼠標(biāo)位于懸浮按鈕上會默認執(zhí)行click事件,經(jīng)驗證,click事件與mouse事件的執(zhí)行順序為onmousedown =》onmouseup =》onclick,意味著在click事件執(zhí)行時會與與其相關(guān)的mouse事件沖突。
解決方案:
因為click事件執(zhí)行時間短,所以利用鼠標(biāo)拖動的時間差作為標(biāo)志,在拖拽事件中計算鼠標(biāo)從onmousedown 到onmouseup 所用的時間差,與200ms作比較,作為全局變量。由于vue的directives自定義指令中無法使用this,所以個人采用給元素設(shè)置屬性的方式來解決全局變量的存儲問題。
1、自定義上下拖拽指令
說明:指令中沒有this關(guān)鍵字,指令中通過el可以直接拿到指令綁定的元素;
directives: {
drag: {
// 指令的定義
bind: function (el) {
let odiv = el; //獲取當(dāng)前元素
let firstTime='',lastTime='';
odiv.onmousedown = (e) => {
document.getElementById('dragbtn').setAttribute('data-flag',false)
firstTime = new Date().getTime();
// 算出鼠標(biāo)相對元素的位置
let disY = e.clientY - odiv.offsetTop;
document.onmousemove = (e) => {
// 用鼠標(biāo)的位置減去鼠標(biāo)相對元素的位置,得到元素的位置
let top = e.clientY - disY;
// 頁面范圍內(nèi)移動元素
if (top > 0 && top < document.body.clientHeight - 48) {
odiv.style.top = top + 'px';
}
};
document.onmouseup = (e) => {
document.onmousemove = null;
document.onmouseup = null;
// onmouseup 時的時間,并計算差值
lastTime = new Date().getTime();
if( (lastTime - firstTime) < 200){
document.getElementById('dragbtn').setAttribute('data-flag',true)
}
};
};
}
}
},
2、懸浮菜單點擊事件中進行驗證。
click(e) {
// 驗證是否為點擊事件,是則繼續(xù)執(zhí)行click事件,否則不執(zhí)行
let isClick = document.getElementById('dragbtn').getAttribute('data-flag');
if(isClick !== 'true') {
return false
}
if (!localStorage.settings) {
return this.$message.error('請選擇必填項并保存');
}
if (this.right === -300) {
this.right = 0;
this.isMask = true;
} else {
this.right = -300;
this.isMask = false;
}
},
補充知識:vue 子組件 created 方法不執(zhí)行問題
近期做了一個項目 里面有一個樹形菜單,將數(shù)據(jù)寫在 js (死數(shù)據(jù))中,所有的東西都能夠正常執(zhí)行(i 標(biāo)簽,子節(jié)點,父節(jié)點),但是當(dāng)在請求接口文件或者請求后臺數(shù)據(jù)的時候,發(fā)現(xiàn)引入的子組件的created方法不執(zhí)行,但是點擊父級菜單展開時還是能夠觸發(fā),后來發(fā)現(xiàn) 是生命周期的問題,仔細查看一下,后來解決!
解決方法如下:
用watch 檢測一下data的數(shù)據(jù)變化,created方法既然在點擊的時候執(zhí)行,所以也必須保留,好啦,就這樣!
以上這篇解決VUE自定義拖拽指令時 onmouseup 與 click事件沖突問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3造輪子之Typescript配置highlight過程
這篇文章主要介紹了Vue3造輪子之Typescript配置highlight過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Vue組件之間的參數(shù)傳遞與方法調(diào)用的實例詳解
這篇文章主要介紹了Vue組件之間的參數(shù)傳遞與方法調(diào)用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12
vue.js實現(xiàn)帶日期星期的數(shù)字時鐘功能示例
這篇文章主要介紹了vue.js實現(xiàn)帶日期星期的數(shù)字時鐘功能,涉及vue.js基于定時器的日期時間運算與數(shù)值操作相關(guān)使用技巧,需要的朋友可以參考下2018-08-08
在vant 中使用cell組件 定義圖標(biāo)該圖片和位置操作
這篇文章主要介紹了在vant 中使用cell組件 定義圖標(biāo)該圖片和位置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Vue-ANTD表單輸入中自定義校驗一些正則表達式規(guī)則介紹
這篇文章主要介紹了Vue-ANTD表單輸入中自定義校驗一些正則表達式規(guī)則介紹,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

