OS X上的Chrome上的execCommand(' copy')失败

时间:2016-03-24 08:52:43

标签: javascript html5 macos ecmascript-6 execcommand

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

基本上是' copyHtmlToClipboard' function创建一个隐藏的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上运行?

THX!

3 个答案:

答案 0 :(得分:1)

Safari并不支持copycut命令。

Source

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

据我所知,这是一个铬虫看到:

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