【问题标题】:Cannot copy html formatted string to clipboard in Chrome无法将 html 格式的字符串复制到 Chrome 中的剪贴板
【发布时间】:2019-07-07 04:54:02
【问题描述】:

我在 angular5 上工作,我必须从 clipboard 复制一些 HTML 代码并将其粘贴到 Outlook 中。我已经为 IE 实现了这一点,但相同的代码在 chrome 中不起作用,chrome 根本不会复制任何内容,也不会显示任何控制台错误。

基本上,一旦我复制,我必须创建一个hyperlink 并在 Outlook 中越过该超链接,当用户单击该链接时,应打开一个带有该超链接引用的新页面。我的代码如下,请帮我实现chrome的复制功能?

public copyToClipboard {
  const body = document.createElement('body');
  const breakLine = document.createElement('br');
  const ol = document.createElement('ol');

  const range = document.createRange();
  document.body.appendChild(body);
  body.appendChild(ol);

  let name: string;
  this.selectedFiles.forEach(doc => {
    const docURL = this.serviceCall();
    const anchor = document.createElement('a');
    const li = document.createElement('li');

    anchor.href = docURL;
    anchor.text = doc.fileName;
    name = doc.name;
    body.appendChild(li).appendChild(anchor);
   });
    range.selectNode(body);

    window.getSelection().addRange(range);
    document.execCommand('copy');
    document.body.removeChild(body);
}

//HTML
<button pButton (click)="copyToClipboard()"></button>

(请忽略我的代码中是否有任何拼写错误,因为我输入的是代码而不是复制+粘贴,此代码在 IE 中运行完美)

【问题讨论】:

  • 什么时候调用?还有任何使用 标签的理由吗?听起来有点自找麻烦。
  • 我已经更新了关于如何调用它的问题。没有使用 的具体原因。这是我第一次尝试的方法,所以我没有玩弄代码。对此有什么建议,我应该尝试其他方法吗?
  • 好吧,body 元素的唯一授权父级是 html 元素。大多数浏览器都允许您在文档的其他位置附加另一个,但您可能会遇到一些问题,这些问题不能真正被视为浏览器错误。而且从快速测试来看,这似乎确实是您当前的问题(这仍然是相当令人惊讶的 TBH)。例如,尝试用
    替换它。
  • @Kaiido 我试着用 div 替换 body 像这样 'const body = document.createElement('div');'但阿拉斯仍然无法在 chrome 中工作——

标签: html typescript google-chrome angular5 clipboard


【解决方案1】:

我猜他们最近对异步 ClipboardAPI 的实现使 Chrome 改变了他们的行为 w.r.t。 execCommand('copy'),因为它现在看起来像是一个异步方法。
execCommand 应该是一个同步方法,所以这符合浏览器错误。

现在的解决方法是在删除源元素之前稍等片刻。

(另请注意,在此处使用

元素是一个坏主意,实际上是问题的另一部分)。

const obj = {
  serviceCall() { return Math.random();},
  selectedFiles: [
    { name: 'foo', fileName: 'foo.bar' },
    { name: 'bar', fileName: 'bar.foo' }
  ],
  copyToClipboard() {
    // don't use a <body> element
    const body = document.createElement('div');
    const breakLine = document.createElement('br');
    const ol = document.createElement('ol');

    const range = document.createRange();
    document.body.appendChild(body);
    body.appendChild(ol);

    let name = ""; // we're in pure js
    this.selectedFiles.forEach(doc => {
      const docURL = this.serviceCall();
      const anchor = document.createElement('a');
      const li = document.createElement('li');

      anchor.href = docURL;
      anchor.text = doc.fileName;
      name = doc.name;
      body.appendChild(li).appendChild(anchor);
    });
    range.selectNode(body);

    window.getSelection().addRange(range);
    document.execCommand('copy');
    // wait just a bit
    requestAnimationFrame(() =>
      document.body.removeChild(body)
    );
  }
}

btn.onclick = e => obj.copyToClipboard();
<button id='btn'>
  copy to clipboard
</button>
<textarea>paste here to check your clipboard's content</textarea>

【讨论】:

  • 感谢您的努力。但是,如果我只复制一个字符串,则此代码可以正常工作,但是当我想复制 HTML(这里我正在形成一个超链接)时,它不起作用,甚至无法复制。不确定这是任何浏览器问题或代码问题。提供一些额外的信息,我有 chrome 70.0.35,我在 angular 5.2.10 上工作,我的客户端机器没有互联网。你有什么想法吗?
  • 另外,补充一点,当我控制台记录 div 时,我可以看到正确的 HTML 形成它只是它没有被复制。
猜你喜欢
相关资源
最近更新 更多
热门标签