如何在JavaScript中复制到剪贴板?

将文本复制到剪贴板的最佳方式是什么? (多浏览器)

我努力了:

function copyToClipboard(text) {
    if (window.clipboardData) { // Internet Explorer
        window.clipboardData.setData("Text", text);
    } else {  
        unsafeWindow.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");  
        const clipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);  
        clipboardHelper.copyString(text);
    }
}

但在Internet Explorer中会出现语法错误。 在Firefox中,它表示unsafeWindow is not defined

不带闪光灯的好技巧:Trello如何访问用户的剪贴板?


概观

有3个主要浏览器API用于复制到剪贴板:

  • 异步剪贴板API [navigator.clipboard.writeText]
  • Chrome 66中的文本聚焦部分(2018年3月)
  • 访问是异步的并使用JavaScript Promises,可以这样编写,以便安全用户提示(如果显示)不会中断页面​​中的JavaScript。
  • 文本可以直接从变量复制到剪贴板。
  • 仅在通过HTTPS提供的页面上受支持。
  • 在Chrome 66中,活动选项卡中的页面可以在没有权限提示的情况下写入剪贴板。
  • document.execCommand('copy')
  • 截至2015年4月,大多数浏览器都支持此功能(请参阅下面的浏览器支持)。
  • 访问是同步的,即停止页面中的JavaScript直到完成,包括显示和用户与任何安全提示进行交互。
  • 从DOM读取文本并将其放在剪贴板上。
  • 在测试期间〜2015年4月,只有Internet Explorer在写入剪贴板时被记录为显示权限提示。
  • 覆盖复制事件
  • 有关覆盖复制事件的信息,请参阅Clipboard API文档。
  • 允许您修改剪贴板上显示的任何复制事件的内容,可以包含纯文本以外的其他数据格式。
  • 这里没有涉及,因为它不直接回答问题。
  • 一般发展笔记

    当您在控制台中测试代码时,不要期望剪贴板相关命令可以正常工作。 一般来说,该页面需要处于活动状态(异步剪贴板API)或需要用户进行交互(例如用户单击)以允许( document.execCommand('copy') )访问剪贴板,以获取更多详细信息。

    异步+后备

    由于浏览器支持新的Async Clipboard API级别,您可能需要回退到document.execCommand('copy')方法以获得良好的浏览器覆盖率。

    这是一个简单的例子:

    function fallbackCopyTextToClipboard(text) {
      var textArea = document.createElement("textarea");
      textArea.value = text;
      document.body.appendChild(textArea);
      textArea.focus();
      textArea.select();
    
      try {
        var successful = document.execCommand('copy');
        var msg = successful ? 'successful' : 'unsuccessful';
        console.log('Fallback: Copying text command was ' + msg);
      } catch (err) {
        console.error('Fallback: Oops, unable to copy', err);
      }
    
      document.body.removeChild(textArea);
    }
    function copyTextToClipboard(text) {
      if (!navigator.clipboard) {
        fallbackCopyTextToClipboard(text);
        return;
      }
      navigator.clipboard.writeText(text).then(function() {
        console.log('Async: Copying to clipboard was successful!');
      }, function(err) {
        console.error('Async: Could not copy text: ', err);
      });
    }
    
    var copyBobBtn = document.querySelector('.js-copy-bob-btn'),
      copyJaneBtn = document.querySelector('.js-copy-jane-btn');
    
    copyBobBtn.addEventListener('click', function(event) {
      copyTextToClipboard('Bob');
    });
    
    
    copyJaneBtn.addEventListener('click', function(event) {
      copyTextToClipboard('Jane');
    });
    <div style="display:inline-block; vertical-align:top;">
      <button class="js-copy-bob-btn">Set clipboard to BOB</button><br /><br />
      <button class="js-copy-jane-btn">Set clipboard to JANE</button>
    </div>
    <div style="display:inline-block;">
      <textarea class="js-test-textarea" cols="35" rows="4">Try pasting into here to see what you have on your clipboard:
      
      </textarea>
    </div>

    自动复制到剪贴板可能是危险的,因此大多数浏览器(IE除外)都非常困难。 我个人使用以下简单的技巧:

    function copyToClipboard(text) {
      window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
    }
    

    用户将看到提示框,其中要复制的文本已被选中。 现在,按Ctrl + C和Enter键(关闭框)就足够了 - 瞧!

    现在剪贴板复制操作是安全的,因为用户手动执行它(但是以一种非常简单的方式)。 当然,适用于所有浏览器。

    <button id="demo" onclick="copyToClipboard(document.getElementById('demo').innerHTML)">This is what I want to copy</button>
    
    <script>
      function copyToClipboard(text) {
        window.prompt("Copy to clipboard: Ctrl+C, Enter", text);
      }
    </script>

    以下方法适用于Chrome,Firefox,Internet Explorer和Edge以及最新版本的Safari(2016年10月发布的版本10中增加了复制支持)。

  • 创建一个textarea并将其内容设置为要复制到剪贴板的文本。
  • 将textarea附加到DOM。
  • 选择textarea中的文本。
  • 调用document.execCommand(“copy”)
  • 从dom中删除textarea。
  • 注意:您不会看到textarea,因为它是在同一个Javascript代码的同步调用中添加和删除的。

    如果你正在自己实现这一点,有些事情需要注意:

  • 出于安全原因,这只能通过点击等事件处理程序进行调用(就像打开窗口一样)。
  • 第一次更新剪贴板时,IE将显示权限对话框。
  • IE和Edge将在textarea聚焦时滚动。
  • execCommand()可能会抛出一些情况。
  • 除非您使用textarea,否则换行符和制表符可能会被吞噬。 (大多数文章似乎推荐使用div)
  • 在显示IE对话框时,textarea将会显示,您需要隐藏它,或者使用IE特定的clipboardData API。
  • 在IE系统管理员可以禁用剪贴板API。
  • 下面的函数应尽可能干净地处理以下所有问题。 如果您发现任何问题或有任何改进建议,请留下评论。

    // Copies a string to the clipboard. Must be called from within an 
    // event handler such as click. May return false if it failed, but
    // this is not always possible. Browser support for Chrome 43+, 
    // Firefox 42+, Safari 10+, Edge and IE 10+.
    // IE: The clipboard feature may be disabled by an administrator. By
    // default a prompt is shown the first time the clipboard is 
    // used (per session).
    function copyToClipboard(text) {
        if (window.clipboardData && window.clipboardData.setData) {
            // IE specific code path to prevent textarea being shown while dialog is visible.
            return clipboardData.setData("Text", text); 
    
        } else if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
            var textarea = document.createElement("textarea");
            textarea.textContent = text;
            textarea.style.position = "fixed";  // Prevent scrolling to bottom of page in MS Edge.
            document.body.appendChild(textarea);
            textarea.select();
            try {
                return document.execCommand("copy");  // Security exception may be thrown by some browsers.
            } catch (ex) {
                console.warn("Copy to clipboard failed.", ex);
                return false;
            } finally {
                document.body.removeChild(textarea);
            }
        }
    }
    

    https://jsfiddle.net/fx6a6n6x/

    链接地址: http://www.djcxy.com/p/439.html

    上一篇: How do I copy to the clipboard in JavaScript?

    下一篇: grep a file, but show several surrounding lines?