最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決VUE自定義拖拽指令時(shí) onmouseup 與 click事件沖突問題

 更新時(shí)間:2020年07月24日 08:38:25   作者:zqian1994  
這篇文章主要介紹了解決VUE自定義拖拽指令時(shí) onmouseup 與 click事件沖突問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

功能描述:

如圖,右側(cè)懸浮菜單按鈕,只支持上下方向拖動(dòng),點(diǎn)擊時(shí)展開或關(guān)閉菜單。

BUG說明:

鼠標(biāo)上下方向拖拽,如果松開時(shí)鼠標(biāo)位于懸浮按鈕上會(huì)默認(rèn)執(zhí)行click事件,經(jīng)驗(yàn)證,click事件與mouse事件的執(zhí)行順序?yàn)閛nmousedown =》onmouseup =》onclick,意味著在click事件執(zhí)行時(shí)會(huì)與與其相關(guān)的mouse事件沖突。

解決方案:

因?yàn)閏lick事件執(zhí)行時(shí)間短,所以利用鼠標(biāo)拖動(dòng)的時(shí)間差作為標(biāo)志,在拖拽事件中計(jì)算鼠標(biāo)從onmousedown 到onmouseup 所用的時(shí)間差,與200ms作比較,作為全局變量。由于vue的directives自定義指令中無法使用this,所以個(gè)人采用給元素設(shè)置屬性的方式來解決全局變量的存儲(chǔ)問題。

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)相對(duì)元素的位置
      let disY = e.clientY - odiv.offsetTop;
      document.onmousemove = (e) => {
       // 用鼠標(biāo)的位置減去鼠標(biāo)相對(duì)元素的位置,得到元素的位置
       let top = e.clientY - disY;
       // 頁面范圍內(nèi)移動(dòng)元素
       if (top > 0 && top < document.body.clientHeight - 48) {
        odiv.style.top = top + 'px';
       }
      };
      document.onmouseup = (e) => {
        document.onmousemove = null;
        document.onmouseup = null;
        // onmouseup 時(shí)的時(shí)間,并計(jì)算差值
        lastTime = new Date().getTime();
        if( (lastTime - firstTime) < 200){
         document.getElementById('dragbtn').setAttribute('data-flag',true)
        }
      };
     };
    }
   }
  },

2、懸浮菜單點(diǎn)擊事件中進(jìn)行驗(yàn)證。

click(e) {
 // 驗(yàn)證是否為點(diǎn)擊事件,是則繼續(xù)執(zhí)行click事件,否則不執(zhí)行
    let isClick = document.getElementById('dragbtn').getAttribute('data-flag');
    if(isClick !== 'true') {
     return false
    }
    if (!localStorage.settings) {
     return this.$message.error('請(qǐng)選擇必填項(xiàng)并保存');
    }
    if (this.right === -300) {
     this.right = 0;
     this.isMask = true;
    } else {
     this.right = -300;
     this.isMask = false;
    }
   },

補(bǔ)充知識(shí):vue 子組件 created 方法不執(zhí)行問題

近期做了一個(gè)項(xiàng)目 里面有一個(gè)樹形菜單,將數(shù)據(jù)寫在 js (死數(shù)據(jù))中,所有的東西都能夠正常執(zhí)行(i 標(biāo)簽,子節(jié)點(diǎn),父節(jié)點(diǎn)),但是當(dāng)在請(qǐng)求接口文件或者請(qǐng)求后臺(tái)數(shù)據(jù)的時(shí)候,發(fā)現(xiàn)引入的子組件的created方法不執(zhí)行,但是點(diǎn)擊父級(jí)菜單展開時(shí)還是能夠觸發(fā),后來發(fā)現(xiàn) 是生命周期的問題,仔細(xì)查看一下,后來解決!

解決方法如下:

用watch 檢測(cè)一下data的數(shù)據(jù)變化,created方法既然在點(diǎn)擊的時(shí)候執(zhí)行,所以也必須保留,好啦,就這樣!

以上這篇解決VUE自定義拖拽指令時(shí) onmouseup 與 click事件沖突問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • antd?select?多選限制個(gè)數(shù)的實(shí)現(xiàn)代碼

    antd?select?多選限制個(gè)數(shù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了antd?select?多選限制個(gè)數(shù),實(shí)現(xiàn)思路和核心代碼都很簡單,其中核心代碼在于disabled,代碼簡單易懂需要的朋友可以參考下
    2022-11-11
  • vue-cli自定義創(chuàng)建項(xiàng)目eslint依賴沖突解決方式

    vue-cli自定義創(chuàng)建項(xiàng)目eslint依賴沖突解決方式

    vue-cli是vue.js的腳手架,用于自動(dòng)生成vue.js+webpack的項(xiàng)目模板,在創(chuàng)建項(xiàng)目時(shí),如果遇到npm安裝報(bào)錯(cuò),通常是由于依賴版本沖突造成的,文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • vue3的組件通信&v-model使用實(shí)例詳解

    vue3的組件通信&v-model使用實(shí)例詳解

    props 主要用于父組件向子組件通信,再父組件中通過使用:msg='msg'綁定需要傳給子組件的屬性值,然后再在子組件中用props接收該屬性值,這篇文章主要介紹了vue3的組件通信&v-model使用,需要的朋友可以參考下
    2024-05-05
  • Vue實(shí)現(xiàn)簡單登錄界面

    Vue實(shí)現(xiàn)簡單登錄界面

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)簡單登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • vue獲取data數(shù)據(jù)改變前后的值方法

    vue獲取data數(shù)據(jù)改變前后的值方法

    今天小編就為大家分享一篇vue獲取data數(shù)據(jù)改變前后的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vuecli4配置sass與less詳解

    vuecli4配置sass與less詳解

    這篇文章主要為大家介紹了vuecli4配置sass與less詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Vue中使用?Aplayer?和?Metingjs?添加音樂插件的方式

    Vue中使用?Aplayer?和?Metingjs?添加音樂插件的方式

    這篇文章主要介紹了Vue中使用?Aplayer?和?Metingjs?添加音樂插件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Vue調(diào)用PC攝像頭實(shí)現(xiàn)拍照功能

    Vue調(diào)用PC攝像頭實(shí)現(xiàn)拍照功能

    這篇文章主要為大家詳細(xì)介紹了Vue調(diào)用PC攝像頭實(shí)現(xiàn)拍照功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • element-ui select多選綁定回顯值問題

    element-ui select多選綁定回顯值問題

    這篇文章主要介紹了element-ui select多選綁定回顯值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue實(shí)現(xiàn)商城購物車功能

    vue實(shí)現(xiàn)商城購物車功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)商城購物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論

佛冈县| 大丰市| 西吉县| 玉树县| 建始县| 鄱阳县| 广东省| 齐河县| 含山县| 汤阴县| 通辽市| 沙田区| 游戏| 永吉县| 车险| 自贡市| 临沭县| 河东区| 大关县| 舞钢市| 镇沅| 古浪县| 咸丰县| 东丽区| 盐亭县| 秭归县| 仲巴县| 响水县| 上蔡县| 习水县| 左权县| 漳州市| 定南县| 凤山市| 襄垣县| 乾安县| 清涧县| 黄冈市| 韶山市| 公安县| 张家界市|