左键选择v-html绑定的文本内容,松开鼠标后出现复制弹窗 ...

打印 上一主题 下一主题

主题 1003|帖子 1003|积分 3011

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

HTML

  1. <template>
  2.   <div class="report_generate_wrap" id="parentElement">
  3.     <div ref="textContainer" @mouseup="mouseUp" v-html="textContent"></div>
  4.     <div v-if="showCopyPopup" :style="copyPopupStyle" class="copy-popup">
  5.       <p>已选中文本,点击复制:</p>
  6.       <button @click="copyText" style="margin-right: 10px">复制</button>
  7.       <button @click="hideCopyPopup">取消</button>
  8.     </div>
  9.   </div>
  10. </template>
复制代码
 JS

  1. data() {
  2.     return {
  3.       textContent: "这是一段示例文本,你可以尝试选中它。",
  4.       showCopyPopup: false,
  5.       selectedText: "",
  6.       lastMousePosition: { x: 0, y: 0 },
  7.       previousSelectedText: "",
  8.     };
  9.   },
  10. computed: {
  11.   copyPopupStyle() {
  12.     return {
  13.       position: "absolute",
  14.       left: `${this.lastMousePosition.x + 20}px`, // 假设弹窗距离鼠标右侧20px
  15.       top: `${this.lastMousePosition.y}px`,
  16.       transform: "translateY(-50%)", // 垂直居中
  17.     };
  18.   },
  19. },
  20. mounted() {
  21.   window.addEventListener("click", this.handleGlobalClick);
  22. },
  23. beforeDestroy() {
  24.   window.removeEventListener("click", this.handleGlobalClick);
  25. },
  26. methods: {
  27.   handleGlobalClick(event) {
  28.     // 如果点击事件不是发生在textContainer元素内,则隐藏复制弹窗
  29.     if (!this.$refs.textContainer.contains(event.target)) {
  30.       this.showCopyPopup = false;
  31.     }
  32.   },
  33.   mouseUp(event) {
  34.     console.log("鼠标松开");
  35.     this.updateMousePosition(event);
  36.     const selection = window.getSelection();
  37.     if (selection.rangeCount > 0) {
  38.       const range = selection.getRangeAt(0);
  39.       this.selectedText = range.toString().trim();
  40.       // 检查当前选中的文本是否与之前选中的文本不同
  41.       if (this.selectedText !== this.previousSelectedText) {
  42.         if (this.selectedText !== "") {
  43.           this.showCopyPopup = true;
  44.         } else {
  45.           this.showCopyPopup = false;
  46.         }
  47.         // 更新之前选中的文本
  48.         this.previousSelectedText = this.selectedText;
  49.       } else {
  50.         // 如果相同,则不显示复制弹出框
  51.         this.showCopyPopup = false;
  52.       }
  53.     } else {
  54.       this.showCopyPopup = false;
  55.       this.selectedText = "";
  56.       this.previousSelectedText = ""; // 清除之前选中的文本
  57.     }
  58.   },
  59.   updateMousePosition(event) {
  60.     const parentElement = document.getElementById("parentElement");
  61.     this.lastMousePosition = {
  62.       x: event.clientX - parentElement.getBoundingClientRect().left,//鼠标相对于父元素的位置
  63.       y: event.clientY,
  64.     };
  65.   },
  66.   copyText() {
  67.     const textarea = document.createElement("textarea");
  68.     textarea.value = this.selectedText;
  69.     document.body.appendChild(textarea);
  70.     textarea.select();
  71.     document.execCommand("copy");
  72.     document.body.removeChild(textarea);
  73.     this.hideCopyPopup();
  74.   },
  75.   hideCopyPopup() {
  76.     this.showCopyPopup = false;
  77.   },
  78. }
复制代码
 CSS

  1. <style scoped lang="less">
  2. .copy-popup {
  3.   background-color: white;
  4.   border: 1px solid #ccc;
  5.   padding: 10px;
  6.   z-index: 1000;
  7. }
  8. </style>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表