js 复制文本到剪切板

作者: 谢小呆呆呆 | 来源:发表于2018-04-10 16:15 被阅读21次

    最近在项目中遇到一个在【移动端网页中复制内容到剪切板】的需求,首先想到 H5 新的 API 似乎增加了 Clipboard 的支持,先来看看兼容情况,这一看真是老泪纵横啊,时隔多年浏览器的支持竟然还这么的差。

    01.png

    这条路只能放弃,同事找到了一个第三方库-clipboardjs ,测试了一下可以完全兼容手机和 PC 。很好奇它是怎么做到的,拜读了源码,原来是重点是 document.execCommand 。曾经在做富文本编辑器的时候使用过这个 API,竟然没有想起来,真是惭愧。再来看一下它的兼容性:

    02.png

    看着这片绿色就让人心情好,我们利用 document.execCommand 先来自己写一个小demo:

    var randomStr = Math.random().toString(16);
      
    var sourceDOM = document.getElementById('sourceDOM'),
        messageDOM = document.getElementById('messageDOM'),
        copyBtn = document.getElementById('copyBtn');
    
    sourceDOM.value = randomStr;
    
    copyBtn.onclick = function() {
      copyTextToClipboard();
    };
    
    function copyTextToClipboard() {
      sourceDOM.select();
      sourceDOM.setSelectionRange(0, sourceDOM.value.length);
      var flag = false;
      try {
        flag = document.execCommand('copy');
      } catch (err) {
        
      }
      if (flag) {
        messageDOM.innerText = '复制成功!';
        sourceDOM.blur();
      } else {
        messageDOM.innerText = '复制失败!';
      }
      setTimeout(function () {
        messageDOM.innerText = '';
      }, 2000);
    }
    

    https://codepen.io/xbl/pen/pLGeGB

    这里的 demo 只有30行的 js 代码,就可以完成对 Textarea 标签的内容进行复制,需要注意的一点,移动端中只有通过事件触发才可以选中文本。当然,这还不够,我们需要更复杂的功能,能够复制所有元素的文本,我们再对 demo 改进一下:

    var messageDOM = document.getElementById('messageDOM');
    
    // 实现一个简单的委托,简化绑定事件代码
    document.addEventListener('click', function (event) {
      var copyBtn = event.srcElement;
      if (copyBtn.className !== 'copyBtn')
        return ;
      var sourceDOM = document.getElementById(copyBtn.getAttribute('source-element'));
      var text = getElementText(sourceDOM);
      if (copyTextToClipboard(text)) {
        messageDOM.innerText = '复制成功!';
      } else {
        messageDOM.innerText = '复制失败!';
      }
      document.body.removeChild(textArea);
      setTimeout(function () {
        messageDOM.innerText = '';
      }, 2000);
    }, false);
    
    function getElementText(element) {
      var nodeName = element.nodeName,
          text = '';
      switch(nodeName) {
        case 'SELECT':
        case 'INPUT':
        case 'TEXTAREA':
          text = element.value;
        break;
        default:
          text = element.innerText;
      }
      return text;
    };
    
    function copyTextToClipboard(text) {
      var textArea = document.createElement('textarea');
      textArea.style.position = 'fixed';
      textArea.style.top = '-9999px';
      textArea.style.left = '-9999px';
      textArea.style.zIndex = -9999;
      textArea.value = text;
      textArea.setAttribute('readonly', '');
      document.body.appendChild(textArea)
    
      textArea.select();
      textArea.setSelectionRange(0, textArea.value.length);
      
      var flag = false;
      try {
        flag = document.execCommand('copy');
      } catch (err) {
        
      }
      return flag;
    }
    

    https://codepen.io/xbl/pen/pLGrEO

    增加了20几行的代码,来讲一下思路:点击【Copy】时先获得元素的文本,再动态创建了一个 Textarea 标签,将元素的文本赋值给 Textarea 然后选中,执行 document.execCommand('copy') 复制到剪切板,之后删除 Textarea 标签,是不是 So Easy!

    原文地址:https://xbl.github.io/2018/04/10/clipboard/

    相关文章

      网友评论

        本文标题:js 复制文本到剪切板

        本文链接:https://www.haomeiwen.com/subject/radnhftx.html