按键时将文本复制到剪贴板

Copy text to clipboard upon keypress

可以使用此库将复制到剪贴板绑定到键盘快捷键吗?

所有 usage examples 假设页面上有一个按钮并等待用户按下该按钮。但是我需要用键盘触发它。

我的尝试甚至没有触发任何回调。我有一个触发器需要手动发出,我找不到它:

jQuery(function($){
  var $placeholder = $("div:first");
  var clipboard = new ClipboardJS($placeholder[0]);
  
  $("textarea").on("keyup", function(event){
    var text;

    if (event.key === "s") {
      text = "Test / " + Math.round(1000000 * Math.random());
      console.log("Copying '%s' to clipboard...", text);
      $placeholder.attr("data-clipboard-text", text);

      clipboard.on('success', function(e) {
        console.info('Action:', e.action);
        console.info('Text:', e.text);
        console.info('Trigger:', e.trigger);
        e.clearSelection();
      });
      clipboard.on('error', function(e) {
        console.error('Action:', e.action);
        console.error('Trigger:', e.trigger);
      });
      // And now what?
    }
  })
});
textarea{
  width: 100%;
  color: red;
}
textarea:focus{
  color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<textarea>Type "s" here to save some text to clipboard. Then use Ctrl+V to see if it worked.</textarea>
<div></div>

我想我找到了我遗漏的要点。我基本上需要自己触发点击事件。我用更明显的东西替换了我的 <div> 占位符:

jQuery(function($){
  var $dummyButton = $("button:first");
  var clipboard = new ClipboardJS($dummyButton[0]);
  clipboard.on('success', function(e) {
    console.info('Action:', e.action);
    console.info('Text:', e.text);
    console.info('Trigger:', e.trigger);
    e.clearSelection();
  });
  clipboard.on('error', function(e) {
    console.error('Action:', e.action);
    console.error('Trigger:', e.trigger);
  });

  $("textarea").on("keyup", function(event){
    var text;

    if (event.key === "s") {
      text = "Test / " + Math.round(1000000 * Math.random());
      console.log("Copying '%s' to clipboard...", text);
      $dummyButton.attr("data-clipboard-text", text);

      $dummyButton.trigger("click");
    }
  })
});
textarea{
  width: 100%;
  color: red;
}
textarea:focus{
  color: green;
}
button {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<textarea>Type "s" here to save some text to clipboard. Then use Ctrl+V to see if it worked.</textarea>
<button>Dummy button</button>

这适用于桌面浏览器,如 Firefox、Chrome、Edge、IE11(此浏览器需要用户许可)以及许多其他浏览器。

没有jQuery的解决方案:

/** Copies a string directly to the clipboard with a simulated button click. */
const copy = s => {
  const dummyButton = document.createElement('button')
  const clipboard = new ClipboardJS(dummyButton, { text: () => s })
  dummyButton.click()
}

// copy on keydown
window.addEventListener('keydown', e => {
  if (e.key === 's') {
    copy('Hello universe')
  }
})

浏览器焦点将移动到虚拟按钮元素,因此之后您可能需要使用 el.focus() 恢复焦点。