ソースを参照

将复制粘贴组件改为 alt 触发,并增加防抖保护和输入态保护、快捷键精准判断,避免浏览器默认行为干扰

dsy 3 日 前
コミット
9a67943168

+ 18 - 1
src/views/book/courseware/create/components/CreateCanvas.vue

@@ -373,7 +373,24 @@ export default {
      * @param {KeyboardEvent} event 键盘事件
      */
     handleCopy(event) {
-      if (event.ctrlKey && event.key === 'c' && this.curComponentId.length > 0) {
+      if (!event || event.isComposing || event.repeat) return;
+
+      // 输入态下不拦截,避免影响用户正常输入
+      const activeElement = document.activeElement;
+      const isInputting =
+        activeElement &&
+        (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA' || activeElement.isContentEditable);
+      if (isInputting) return;
+
+      const isAltV =
+        event.altKey &&
+        !event.ctrlKey &&
+        !event.metaKey &&
+        !event.shiftKey &&
+        (event.code === 'KeyV' || String(event.key).toLowerCase() === 'c');
+
+      if (isAltV) {
+        event.preventDefault();
         this.findChildComponentByKey(`grid-${this.curComponentId}`)?.copyComponent();
       }
     },

+ 18 - 1
src/views/book/courseware/create/index.vue

@@ -116,7 +116,24 @@ export default {
      * @param {KeyboardEvent} event 键盘事件
      */
     handlePaste(event) {
-      if (event.ctrlKey && event.key === 'v') {
+      if (!event || event.isComposing || event.repeat) return;
+
+      // 输入态下不拦截,避免影响用户正常输入
+      const activeElement = document.activeElement;
+      const isInputting =
+        activeElement &&
+        (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA' || activeElement.isContentEditable);
+      if (isInputting) return;
+
+      const isAltV =
+        event.altKey &&
+        !event.ctrlKey &&
+        !event.metaKey &&
+        !event.shiftKey &&
+        (event.code === 'KeyV' || String(event.key).toLowerCase() === 'v');
+
+      if (isAltV) {
+        event.preventDefault();
         this.pasteComponent('bottom');
       }
     },