【问题标题】:execCommand('copy') fails on Chrome on OS XexecCommand('copy') 在 OS X 上的 Chrome 上失败
【发布时间】:2016-03-24 08:52:43
【问题描述】:

考虑以下jsfiddle,用户可以单击包含粗体文本的 div,然后执行复制 (ctrl+c win cmd+c mac) 将 html 作为 HTML 复制到剪贴板。如果您随后粘贴到例如 gmail 中,您将获得 html 格式。

'copyHtmlToClipboard' 函数基本上会创建一个隐藏的 div,将 html 复制到其中,使用 document.createRange 选择它,然后调用 document.execCommand('copy')

function copyHtmlToClipboard(html) {
  var div = document.createElement("div");
  div.style.opacity = 0;
  div.style.position = "absolute";
  div.style.pointerEvents = "none";
  div.style.zIndex = -1;  
  div.setAttribute('tabindex', '-1'); // so it can be focused
  div.innerHTML = html;
  document.body.appendChild(div);

  var focused=document.activeElement;
  div.focus();

  window.getSelection().removeAllRanges();  
  var range = document.createRange(); 
  // not using range.selectNode(div) as that makes chrome add an extra <br>
  range.setStartBefore(div.firstChild);
  range.setEndAfter(div.lastChild);
  //range.selectNode(div); 
  window.getSelection().addRange(range);  

  var ok=false;
  try {
    ok = document.execCommand('copy');
  } catch (err) {
    console.log(err);
  }
  if (!ok) console.log('execCommand failed!');

  window.getSelection().removeAllRanges();  
  document.body.removeChild(div);

  focused.focus();
}

在 Windows Chrome/Firefox 上,这可以正常工作。

但是在 Mac 上 Chrome execCommand 返回 false。

如何让这段代码在 Mac 上运行?

谢谢!

【问题讨论】:

标签: javascript html macos ecmascript-6 execcommand


【解决方案1】:

Safari 不支持 copycut 命令。

Source

【讨论】:

  • 好的,我明白了。但是 Mac 上的 Chrome 呢?为什么它不能在那里工作,可以让它工作吗?
  • 我在 Mac 和 Windows 上都运行 thiscopy 在这两种 Chrome 上都运行你确定你的 Chrome 版本在 Mac 上高于 42 版吗?
  • 但在代码笔中它可以工作!我在做什么不同?你能试试我的小提琴吗?
  • 我有时间去看看
【解决方案2】:

这是因为只有在用户操作引起的某些事件之后才允许您调用copy 命令。

这些事件被命名为“半可信事件”,您可以找到列表in speccopy 事件不在列表中,因此无法在事件处理程序中复制文本。您可以改为收听keyup 事件,然后在检查ctrl+c 被按下后触发您的操作

【讨论】:

  • thx 但这并不能解释为什么它可以在 chrome windows 上工作,但不能在 chrome mac 上工作
  • 可能与这些系统中触发和hadnling copy事件的实现有关
  • 阅读您引用的部分,我认为它不相关。这是关于调度复制事件,因为我在浏览器已经调度的复制事件中调用 execCommand(copy)
  • 据我所知,Chrome OSX 上的事件受信任。如果我控制台记录 isTrusted 标志,我会得到真实的。还是 execCommand('copy' 返回 false
【解决方案3】:

据我所知,这是一个 chrome 错误,请参阅:

https://bugs.chromium.org/p/chromium/issues/detail?id=552975

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2013-02-12
    相关资源
    最近更新 更多