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

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

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

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

代碼如下

<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); // 初始化全局點(diǎn)擊事件,隱藏右鍵菜單
  initVditor();
});
const vditor = ref(null); // 使用 ref 來(lái)存儲(chǔ) vditor 實(shí)例
const initVditor = () => {
  if (vditor.value) {
    vditor.value.setValue("你好,這是測(cè)試");
  } else {
    console.log("初始化macket", import.meta.env.MODE);
    vditor.value = new Vditor("vditor", {
      width: "100%",
      cdn: import.meta.env.MODE === "development" ? "./public" : "./",
      placeholder: "請(qǐng)輸入內(nèi)容...",
      toolbar: [],
      preview: {
        markdown: {
          sanitize: false,
        },
      },
      after() {
        vditor.value.setValue("你好,這是測(cè)試"); // 一次性設(shè)置所有內(nèi)容,并移除開(kā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); // 點(diǎn)擊其他地方隱藏菜單
  // 保存當(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("沒(méi)有選中的文本");
  }
  // 延遲聚焦以保持選中狀態(tài)
  setTimeout(() => {
    vditor.value.focus();
  }, 0);
  vditor.value.updateValue(copiedText.value);
  hideMenu();
}
// 粘貼文本
function pasteText() {
  if (fuzhitext.value) {
    vditor.value.deleteValue();
    // 這里你可以使用插入內(nèi)容的API來(lái)粘貼文本
    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("沒(méi)有選中的文本");
  }
  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; /* 添加下拉動(dòng)畫(huà) */
}
.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; /* 添加背景色過(guò)渡效果 */
}
.custom-menu ul li:hover {
  background-color: #e9f5ff; /* 懸停時(shí)背景色變化 */
  border-radius: 10px;
}
/* 下拉動(dòng)畫(huà) */
@keyframes slideDown {
  from {
    opacity: 0;
    transform: translateY(-10px); /* 初始位置稍微上移 */
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
</style>

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

相關(guān)文章

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

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

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

    vue-router源碼之history類的淺析

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

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

    這篇文章主要為大家詳細(xì)介紹了Vue + Element UI圖片上傳控件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    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開(kāi)發(fā)公共組件之返回頂部

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

浮梁县| 东丰县| 安徽省| 遂昌县| 安顺市| 甘洛县| 即墨市| 彩票| 峡江县| 林芝县| 淄博市| 衡阳县| 岚皋县| 都兰县| 怀仁县| 临潭县| 天镇县| 香河县| 铅山县| 偃师市| 建平县| 凤山市| 卢龙县| 鄱阳县| 银川市| 沂水县| 曲阜市| 富民县| 邳州市| 图片| 巩留县| 台南市| 乐亭县| 仙桃市| 城口县| 太仆寺旗| 赤壁市| 揭西县| 松滋市| 丹寨县| 阳朔县|