Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
T treasure
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 14
    • Issues 14
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • External wiki
    • External wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • FE
  • treasure
  • Issues
  • #199

Closed
Open
Created Oct 19, 2023 by liuyajun@liuyajunMaintainer

使用 vue-clipboard3 的 toClipboard 复制空字符串时报错

背景

使用 vue-clipboard3 的 toClipboard 复制空字符串时报错,代码与报错信息如下:

  try {
    const { toClipboard } = useClipboard();
    await toClipboard('');
  } catch (error) {
    console.log('error', error);
  }

image

阅读源码

node_modules/vue-clipboard3/dist/esm/index.js 核心代码

// make fake element
const fakeEl = document.createElement('button');
// setup a new Clipboard.js
const clipboard = new Clipboard(fakeEl, {
    text: () => text,
    action: () => 'copy',
    container: container !== undefined ? container : document.body
});
// ...
// simulate click
fakeEl.click(); // 调用 click 触发复制

核心机制为 clipboard.js node_modules/clipboard/src/clipboard.js

核心流程:onClick > action = 'copy' > text = ClipboardActionDefault > text ? 'success' : 'error'(得到 error) > reject(e)(抛出 emit 回调参数)

  • 通过 createFakeElement,创建一个 textarea,将文本放入
  • 通过 select 选中内容,然后通过 command('copy') 也就是 document.execCommand('copy') 复制选中内容到剪切板
  • 通过 ClipboardActionDefault 拿到文本,如果文本为空,emit 抛出 error,以及回调参数 { action, text, trigger, clearSelection }
  • 可以在控制台内测试,如果不选中文本直接执行 document.execCommand('copy') 时不生效的
  • 所以不能复制空字符串

解决方案

使用 avigator.clipboard.writeText('') 代替

Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking