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

vue3?實現(xiàn)右鍵菜單編輯復(fù)制粘貼功能

 更新時間:2024年10月23日 11:05:51   作者:橫沖直撞de  
在瀏覽器中,Vue3編輯器自帶默認(rèn)右鍵菜單,然而,在Electron桌面應(yīng)用中,這一功能需自行編寫代碼實現(xiàn),本文詳細(xì)介紹了如何在Vue3中手動實現(xiàn)右鍵菜單的編輯、復(fù)制、粘貼功能,并提供了代碼示例,更多細(xì)節(jié)和相關(guān)教程可參考腳本之家的其他文章

vue3編輯器在瀏覽器有默認(rèn)的右鍵菜單,但是在客戶端electron中要實現(xiàn)這個右鍵菜單的功能需要手寫。

代碼如下

<template>
  <!-- 右鍵菜單 -->
  <div>
    <div
      v-if="menuVisible"
      @mousedown.prevent
      class="custom-menu"
      :style="{ top: menuY + 'px', left: menuX + 'px' }"
    >
      <ul>
        <li @click="copyText">復(fù)制</li>
        <li @click="cutText">剪切</li>
        <li @click="pasteText">粘貼</li>
      </ul>
    </div>
    <div id="vditor" @contextmenu.prevent="showMenu"></div>
  </div>
</template>
<script setup>
// 安裝插件vditor
import Vditor from "vditor";
import "vditor/dist/index.css";
import { ref, onMounted } from "vue";
onMounted(() => {
  document.addEventListener("click", hideMenu); // 初始化全局點擊事件,隱藏右鍵菜單
  initVditor();
});
const vditor = ref(null); // 使用 ref 來存儲 vditor 實例
const initVditor = () => {
  if (vditor.value) {
    vditor.value.setValue("你好,這是測試");
  } else {
    console.log("初始化macket", import.meta.env.MODE);
    vditor.value = new Vditor("vditor", {
      width: "100%",
      cdn: import.meta.env.MODE === "development" ? "./public" : "./",
      placeholder: "請輸入內(nèi)容...",
      toolbar: [],
      preview: {
        markdown: {
          sanitize: false,
        },
      },
      after() {
        vditor.value.setValue("你好,這是測試"); // 一次性設(shè)置所有內(nèi)容,并移除開頭的多余空格
      },
      input(value) {
        const markdownContent = vditor.value.getValue();
      },
    });
  }
};
// 用于控制右鍵菜單的顯示和位置
const menuVisible = ref(false);
const menuX = ref(0);
const menuY = ref(0);
const copiedText = ref(""); // 用于保存復(fù)制或剪切的文本
let lastFocusedElement = null; // 用于保存最后聚焦的元素
const fuzhitext = ref("");
// 顯示右鍵菜單
function showMenu(event) {
  copiedText.value = vditor.value.getSelection();
  menuVisible.value = true;
  menuX.value = event.clientX;
  menuY.value = event.clientY;
  document.addEventListener("click", hideMenu); // 點擊其他地方隱藏菜單
  // 保存當(dāng)前聚焦的元素
  lastFocusedElement = document.activeElement;
  console.log(lastFocusedElement);
}
// 隱藏右鍵菜單
function hideMenu() {
  menuVisible.value = false;
  //   document.removeEventListener('click', hideMenu);
}
// 復(fù)制選中的文本
function copyText() {
  if (copiedText.value) {
    console.log("復(fù)制的內(nèi)容:", copiedText.value);
    fuzhitext.value = copiedText.value;
  } else {
    console.log("沒有選中的文本");
  }
  // 延遲聚焦以保持選中狀態(tài)
  setTimeout(() => {
    vditor.value.focus();
  }, 0);
  vditor.value.updateValue(copiedText.value);
  hideMenu();
}
// 粘貼文本
function pasteText() {
  if (fuzhitext.value) {
    vditor.value.deleteValue();
    // 這里你可以使用插入內(nèi)容的API來粘貼文本
    vditor.value.insertValue(fuzhitext.value);
  }
  setTimeout(() => {
    lastFocusedElement.focus();
  }, 0);
  hideMenu();
}
// 剪切
function cutText() {
  if (copiedText.value) {
    console.log("復(fù)制的內(nèi)容:", copiedText.value);
    fuzhitext.value = copiedText.value;
  } else {
    console.log("沒有選中的文本");
  }
  vditor.value.deleteValue();
  setTimeout(() => {
    lastFocusedElement.focus();
  }, 0);
  hideMenu();
}
</script>
<style scoped>
.custom-menu {
  position: absolute;
  background-color: white;
  border: 1px solid #ccc;
  border-radius: 10px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
  z-index: 1000;
  animation: slideDown 0.2s ease-in-out; /* 添加下拉動畫 */
}
.custom-menu ul {
  list-style-type: none;
  padding: 0; /* 移除內(nèi)邊距 */
  margin: 0; /* 移除外邊距 */
  min-width: 95px;
}
.custom-menu ul li {
  padding: 8px 30px; /* 增加上下內(nèi)邊距 */
  cursor: pointer;
  transition: background-color 0.2s; /* 添加背景色過渡效果 */
}
.custom-menu ul li:hover {
  background-color: #e9f5ff; /* 懸停時背景色變化 */
  border-radius: 10px;
}
/* 下拉動畫 */
@keyframes slideDown {
  from {
    opacity: 0;
    transform: translateY(-10px); /* 初始位置稍微上移 */
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
</style>

到此這篇關(guān)于vue3 實現(xiàn) 右鍵菜單編輯復(fù)制粘貼的文章就介紹到這了,更多相關(guān)vue3 右鍵菜單編輯復(fù)制粘貼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue實現(xiàn)數(shù)字變換動畫的示例代碼

    vue實現(xiàn)數(shù)字變換動畫的示例代碼

    本文主要介紹了vue實現(xiàn)數(shù)字變換動畫的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • vue-router源碼之history類的淺析

    vue-router源碼之history類的淺析

    這篇文章主要介紹了vue-router源碼之history類的淺析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Vue + Element UI圖片上傳控件使用詳解

    Vue + Element UI圖片上傳控件使用詳解

    這篇文章主要為大家詳細(xì)介紹了Vue + Element UI圖片上傳控件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • vue2組件進(jìn)階與插槽詳解(推薦!)

    vue2組件進(jìn)階與插槽詳解(推薦!)

    插槽(slot)作用是讓父組件可以往子組件指定位置插入?html?結(jié)構(gòu),也是組件的一種通信方式,下面這篇文章主要給大家介紹了關(guān)于vue2組件進(jìn)階與插槽的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • vue開發(fā)公共組件之返回頂部

    vue開發(fā)公共組件之返回頂部

    這篇文章主要為大家詳細(xì)介紹了vue開發(fā)公共組件之返回頂部,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • element-ui Upload上傳組件動態(tài)配置action方式

    element-ui Upload上傳組件動態(tài)配置action方式

    這篇文章主要介紹了element-ui Upload上傳組件動態(tài)配置action方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue-router實現(xiàn)編程式導(dǎo)航的代碼實例

    vue-router實現(xiàn)編程式導(dǎo)航的代碼實例

    今天小編就為大家分享一篇關(guān)于vue-router實現(xiàn)編程式導(dǎo)航的代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 前端Vue全屏screenfull通用解決方案及原理詳細(xì)分析

    前端Vue全屏screenfull通用解決方案及原理詳細(xì)分析

    這篇文章主要給大家介紹了關(guān)于前端Vue全屏screenfull通用解決方案及原理的相關(guān)資料,使用screenfull這一第三方庫可以實現(xiàn)更穩(wěn)定的全屏功能,需要的朋友可以參考下
    2024-10-10
  • Vue3中watch監(jiān)聽使用詳解

    Vue3中watch監(jiān)聽使用詳解

    watch 函數(shù)用來偵聽特定的數(shù)據(jù)源,并在回調(diào)函數(shù)中執(zhí)行副作用,下面這篇文章主要給大家介紹了關(guān)于Vue3中watch監(jiān)聽使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Vue學(xué)習(xí)之a(chǎn)xios的使用方法實例分析

    Vue學(xué)習(xí)之a(chǎn)xios的使用方法實例分析

    這篇文章主要介紹了Vue學(xué)習(xí)之a(chǎn)xios的使用方法,結(jié)合實例形式分析了vue.js axios庫的功能及網(wǎng)絡(luò)請求相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01

最新評論

蕲春县| 繁昌县| 恭城| 普兰店市| 交城县| 中西区| 禄丰县| 清苑县| 凭祥市| 河东区| 绥滨县| 合作市| 奉化市| 庆安县| 高雄县| 如皋市| 汝城县| 贵定县| 岐山县| 三台县| 永德县| 西充县| 高陵县| 枣庄市| 五河县| 宜良县| 虎林市| 仪陇县| 江阴市| 武义县| 开化县| 来宾市| 景宁| 吴忠市| 班玛县| 隆子县| 湖南省| 泗洪县| 新郑市| 鄂尔多斯市| 玉山县|