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

Vue自定義指令實(shí)現(xiàn)點(diǎn)擊右鍵彈出菜單示例詳解

 更新時(shí)間:2023年01月11日 10:56:54   作者:xiaoxiaok  
這篇文章主要為大家介紹了Vue自定義指令實(shí)現(xiàn)點(diǎn)擊右鍵彈出菜單示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、實(shí)現(xiàn)思路

1.使用contextmenu事件

該需求需要攔截瀏覽器的右擊事件,更改為自定義監(jiān)聽事件,可使用@contextmenu.prevent直接綁定一個監(jiān)聽函數(shù),它的作用就是攔截右擊事件并觸發(fā)綁定的監(jiān)聽事件。

其次,為了在右擊的位置打開菜單,我們需要獲取鼠標(biāo)點(diǎn)擊的位置;一般來說,若綁定的函數(shù)沒有自定義參數(shù),則可以直接使用默認(rèn)的參數(shù)e來獲?。蝗艚壎ǖ暮瘮?shù)具有自定義參數(shù),則需要定義$event來獲取位置,即

@contextmenu.prevent="rightclick(index, indexMeasure, $event)

最后,通過參數(shù)event可獲取鼠標(biāo)點(diǎn)擊的橫向X軸值和豎直Y軸值,然后使用固定定位來對菜單進(jìn)行偏移,因?yàn)楣潭ǘㄎ皇窍鄬τ跒g覽器窗口,且獲取的X和Y軸值也是相對于瀏覽器窗口的。

  #menu {
      z-index: 999;
      display: none;
      position: fixed;
      width: 150px;
      border: 1px solid #ccc;
      background: #eee;
    }

2.點(diǎn)擊菜單之外的任意地方關(guān)閉菜單

在mounted里邊監(jiān)聽全局的點(diǎn)擊事件即可

mounted () {
    // 鼠標(biāo)點(diǎn)擊其他位置時(shí)隱藏菜單
    document.onclick = function () {
      menu.style.display = 'none';
    }
}

3.菜單置于圖層的最頂層

該需求是為了避免在點(diǎn)擊菜單項(xiàng)時(shí),觸發(fā)了其他元素綁定的監(jiān)聽函數(shù)。這其實(shí)跟圖層有關(guān),我們只需要將菜單置到頂層即可。使用的是z-index屬性,如下

  #menu {
      z-index: 999;
      display: none;
      position: fixed;
      width: 150px;
      border: 1px solid #ccc;
      background: #eee;
    }

二、源代碼

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>使用Vue自定義指令實(shí)現(xiàn)右鍵菜單</title>
  <script src="js/vue.js"></script>
  <style>
    /* 自定義右鍵菜單 */
    #menu {
      z-index: 999;
      display: none;
      position: fixed;
      width: 150px;
      border: 1px solid #ccc;
      background: #eee;
    }
    #menu ul {
      margin: 5px 0;
    }
    #menu li {
      height: 30px;
      line-height: 30px;
      color: #21232E;
      font-size: 12px;
      text-align: center;
      cursor: default;
      list-style-type: none;
      border-bottom: 1px dashed #cecece;
    }
    #menu li:hover {
      background-color: #cccccc;
    }
    .block {
      height: 300px;
      width: 400px;
      background-color: pink;
      margin-bottom: 15px;
    }
  </style>
</head>
<body>
  <div id="itany">
    <div style="position: relative;">
      <div class="block" v-rightclick>1</div>
      <div class="block" v-rightclick>2</div>
      <div class="block" v-rightclick>3</div>
      <div class="block" v-rightclick>4</div>
      <div class="block" v-rightclick>5</div>
      <div class="block" v-rightclick>6</div>
      <!-- 自定義鼠標(biāo)右鍵菜單 -->
      <div id="menu">
        <ul>
          <li v-for="item in rightMenuList" @click="item.handler">
            {{item.text}}
          </li>
        </ul>
      </div>
    </div>
  </div>
  <script>
    Vue.directive('rightclick', function (el, binding) {
      el.oncontextmenu = function (e) {
        console.log('e.clientY', e.clientY)
        // console.log('e.clientX', e.clientX)
        e.preventDefault();
        menu.style.display = 'block';
        menu.style.left = e.clientX + 'px';
        menu.style.top = e.clientY + 'px';
      }
    });
    var vm = new Vue({
      el: '#itany',
      data: {
        rightMenuList: [
          {
            id: 0,
            text: "開通道",
            handler: () => {
              alert('通道開啟成功');
            }
          },
          {
            id: 1,
            text: "關(guān)通道",
            handler: () => {
              alert('通道關(guān)閉成功');
            }
          },
          {
            id: 2,
            text: "重啟通道",
            handler: () => {
              alert('通道重啟成功');
            }
          },
        ]
      },
      methods: {
      },
      mounted () {
        // 鼠標(biāo)點(diǎn)擊其他位置時(shí)隱藏菜單
        document.onclick = function () {
          menu.style.display = 'none';
        }
      }
    });
  </script>
</body>
</html>

以上就是Vue自定義指令實(shí)現(xiàn)點(diǎn)擊右鍵彈出菜單示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue自定義指令右鍵彈出菜單的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue3中的reactive函數(shù)聲明數(shù)組方式

    vue3中的reactive函數(shù)聲明數(shù)組方式

    這篇文章主要介紹了vue3中的reactive函數(shù)聲明數(shù)組方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • M1 pro芯片啟動Vue項(xiàng)目的方法步驟

    M1 pro芯片啟動Vue項(xiàng)目的方法步驟

    本文主要介紹了M1 pro芯片啟動Vue項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享

    vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享

    這篇文章主要介紹了vue2.0 如何在hash模式下實(shí)現(xiàn)微信分享,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解vue組件之間相互傳值的方式

    詳解vue組件之間相互傳值的方式

    這篇文章主要介紹了vue組件之間相互傳值的方式,對vue感興趣的同學(xué),可以參考下
    2021-05-05
  • vue3+ts import引入第三方j(luò)s文件報(bào)錯的2種解決方法

    vue3+ts import引入第三方j(luò)s文件報(bào)錯的2種解決方法

    這篇文章主要給大家介紹了關(guān)于vue3+ts import引入第三方j(luò)s文件報(bào)錯的2種解決方法,在Vue中通常我們引入一個js插件都是使用npm方式下載然后import使用的,需要的朋友可以參考下
    2023-08-08
  • Vue3的7種種組件通信詳情

    Vue3的7種種組件通信詳情

    Vue3兼容大部分Vue2的特性,用Vue2代碼開發(fā)Vue3都可以,性能上面打包大小減少 41%,初次渲染快 55%,更新快 133%,內(nèi)存使用減少 54%,本篇文章主要介紹Vue3的7種種組件通信,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • react和vue的事件處理差異詳解

    react和vue的事件處理差異詳解

    這篇文章主要介紹了react和vue的事件處理差異,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 前端新手小白的Vue3入坑超詳細(xì)指南

    前端新手小白的Vue3入坑超詳細(xì)指南

    這篇文章主要介紹了如何使用Vite安裝和啟動Vue3項(xiàng)目,并推薦了一些常用的第三方庫,如js-tool-big-box、less或sass預(yù)處理器、axios請求庫以及Element?Plus?UI庫,需要的朋友可以參考下
    2024-12-12
  • vue動態(tài)的 BreadCrumb 組件el-breadcrumb ElementUI詳解

    vue動態(tài)的 BreadCrumb 組件el-breadcrumb ElementUI詳解

    這篇文章主要介紹了vue如何做一個動態(tài)的 BreadCrumb 組件,el-breadcrumb ElementUI
    ,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • vue源碼學(xué)習(xí)之Object.defineProperty 對數(shù)組監(jiān)聽

    vue源碼學(xué)習(xí)之Object.defineProperty 對數(shù)組監(jiān)聽

    這篇文章主要介紹了vue源碼學(xué)習(xí)之Object.defineProperty 對數(shù)組監(jiān)聽,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05

最新評論

丹东市| 苗栗县| 舟曲县| 公安县| 锡林郭勒盟| 深水埗区| 偏关县| 黄冈市| 阜阳市| 伊宁市| 电白县| 博乐市| 磴口县| 曲阜市| 广平县| 西华县| 黄平县| 邵阳县| 鄂伦春自治旗| 色达县| 旅游| 吕梁市| 涪陵区| 左贡县| 万源市| 安化县| 南陵县| 湘阴县| 富阳市| 湖南省| 宜章县| 诸暨市| 丹阳市| 嵊泗县| 武宁县| 平阴县| 绍兴县| 贵德县| 城固县| 郎溪县| 灯塔市|