huangxw hace 4 meses
padre
commit
de0a3bdccb
Se han modificado 2 ficheros con 58 adiciones y 52 borrados
  1. 49 49
      src/directive/common/copyText.ts
  2. 9 3
      src/views/training/meeting/index.vue

+ 49 - 49
src/directive/common/copyText.ts

@@ -5,63 +5,63 @@
 import { DirectiveBinding } from 'vue';
 
 export default {
-  beforeMount(el: any, { value, arg }: DirectiveBinding) {
-    if (arg === 'callback') {
-      el.$copyCallback = value;
-    } else {
-      el.$copyValue = value;
-      const handler = () => {
-        copyTextToClipboard(el.$copyValue);
-        if (el.$copyCallback) {
-          el.$copyCallback(el.$copyValue);
+    beforeMount(el: any, { value, arg }: DirectiveBinding) {
+        if (arg === 'callback') {
+            el.$copyCallback = value;
+        } else {
+            el.$copyValue = value;
+            const handler = () => {
+                copyTextToClipboard(el.$copyValue);
+                if (el.$copyCallback) {
+                    el.$copyCallback(el.$copyValue);
+                }
+            };
+            el.addEventListener('click', handler);
+            el.$destroyCopy = () => el.removeEventListener('click', handler);
         }
-      };
-      el.addEventListener('click', handler);
-      el.$destroyCopy = () => el.removeEventListener('click', handler);
     }
-  }
 };
 
-function copyTextToClipboard(input: string, { target = document.body } = {}) {
-  const element = document.createElement('textarea');
-  const previouslyFocusedElement = document.activeElement as HTMLInputElement;
-  element.value = input;
-  // Prevent keyboard from showing on mobile
-  element.setAttribute('readonly', '');
+export function copyTextToClipboard(input: string, { target = document.body } = {}) {
+    const element = document.createElement('textarea');
+    const previouslyFocusedElement = document.activeElement as HTMLInputElement;
+    element.value = input;
+    // Prevent keyboard from showing on mobile
+    element.setAttribute('readonly', '');
 
-  element.style.contain = 'strict';
-  element.style.position = 'absolute';
-  element.style.left = '-9999px';
-  element.style.fontSize = '12pt'; // Prevent zooming on iOS
+    element.style.contain = 'strict';
+    element.style.position = 'absolute';
+    element.style.left = '-9999px';
+    element.style.fontSize = '12pt'; // Prevent zooming on iOS
 
-  const selection = document.getSelection();
-  let originalRange;
-  if (selection) {
-    originalRange = selection?.rangeCount > 0 && selection.getRangeAt(0);
-  }
-  target.append(element);
-  element.select();
+    const selection = document.getSelection();
+    let originalRange;
+    if (selection) {
+        originalRange = selection?.rangeCount > 0 && selection.getRangeAt(0);
+    }
+    target.append(element);
+    element.select();
 
-  // Explicit selection workaround for iOS
-  element.selectionStart = 0;
-  element.selectionEnd = input.length;
+    // Explicit selection workaround for iOS
+    element.selectionStart = 0;
+    element.selectionEnd = input.length;
 
-  let isSuccess = false;
-  try {
-    isSuccess = document.execCommand('copy');
-  } catch (err) {
-    console.error(err);
-  }
-  element.remove();
+    let isSuccess = false;
+    try {
+        isSuccess = document.execCommand('copy');
+    } catch (err) {
+        console.error(err);
+    }
+    element.remove();
 
-  if (originalRange) {
-    selection?.removeAllRanges();
-    selection?.addRange(originalRange);
-  }
+    if (originalRange) {
+        selection?.removeAllRanges();
+        selection?.addRange(originalRange);
+    }
 
-  // Get the focus back on the previously focused element, if any
-  if (previouslyFocusedElement) {
-    previouslyFocusedElement.focus();
-  }
-  return isSuccess;
+    // Get the focus back on the previously focused element, if any
+    if (previouslyFocusedElement) {
+        previouslyFocusedElement.focus();
+    }
+    return isSuccess;
 }

+ 9 - 3
src/views/training/meeting/index.vue

@@ -149,6 +149,9 @@ import { offOrNoTemp, publishTraining, queryTrainingCount, trainingDelete, train
 import { colNoData } from '@/utils/noData';
 import { searchTabs } from '@/views/models';
 import { SignInCode, TemporaryRegistration } from '../models';
+import { copyTextToClipboard } from '@/directive/common/copyText';
+
+
 
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -315,9 +318,12 @@ const ckeckpageEnable = (trainingName,pageId,id)=>{
 // 复制文本到剪贴板
 const copyToClipboard = async (text)=>{
   try {
-    await navigator.clipboard.writeText(text);
-    console.log('文本已成功复制到剪贴板');
-    return true;
+    const sc = copyTextToClipboard(text)
+    if (sc) {
+        ElMessage.success('复制成功');
+    } else {
+        ElMessage.error('复制失败,请手动复制');
+    }
   } catch (err) {
     console.error('无法复制文本: ', err);
     return false;