美文网首页
JS-复制功能的填坑之路

JS-复制功能的填坑之路

作者: DullCat | 来源:发表于2019-07-08 04:03 被阅读0次

本来这只是我笔记本上的一个小小的code snippet,但是最近拿出来复用的时候不断发现新的坑,所以干脆写篇博客,以戒后人

最开始我使用的复制代码只有这么一点
坑:只能用于input和textarea,且不能元素不能被隐藏,且选中值为value属性

var copyDOM = $("#node"); //要复制文字的节点
copyText .select(); //选择
document.execCommand("Copy"); //执行复制

然后我发现在iphone下不起作用,所以在网上找了个这个

function copyText(text) {
    //创建节点
    var copyDOM = document.createElement('input');
    //要复制的字符串
    copyDOM.value = text;
    document.body.appendChild(copyDOM);
    //选择
    copyDOM.setSelectionRange(0, copyDOM.value.length); 
    copyDOM.focus();
    document.execCommand("Copy"); //复制
    copyDOM.style.display = 'none'; //隐藏创建的节点
    alert('复制成功!');
}

然后发现在ios10及以上会发生难以忍受的卡顿,随后查阅了大量的资料,无获

const el = document.createElement('input');
const btn = document.getElementById('btn');
el.value = '待复制文本';
el.style.opacity = '0';
document.body.appendChild(el);
const editable = el.contentEditable;
const readOnly = el.readOnly;
el.contentEditable = true;
el.readOnly = false;
const range = document.createRange();
range.selectNodeContents(el);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
el.setSelectionRange(0, 999999);
el.contentEditable = editable;
el.readOnly = readOnly;
const ret = document.execCommand('copy');
el.blur();
btn.text = ret ? '已复制' : '复制失败';

最后发现ios10卡顿的原因就是因为代码里创建的节点,遂改

    function copyText(aim) {
        var copyDOM = document.getElementById(aim);
        if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) {//区分iPhone设备
            //这段代码必须放在前面否则无效
            window.getSelection().removeAllRanges();
            //要复制文字的节点
            var range = document.createRange();
            // 选中需要复制的节点
            range.selectNode(copyDOM);
            // 执行选中元素
            window.getSelection().addRange(range);
            // 执行 copy 操作
            document.execCommand('copy');
            // 移除选中的元素
            window.getSelection().removeAllRanges();
        } else {
            copyDOM.select(); // 选择对象
            document.execCommand("Copy"); // 执行浏览器复制命令
        }
        alert("复制成功")
    }

后仍觉不满(因为充斥着大量本猫看不懂的函数),再改

function copyText(aim) {
    var copyDOM = document.getElementById(aim);
    // copyDOM.value='want to cope string'; //如果你想要直接复制字符串
    copyDOM.setSelectionRange(0, copyDOM.value.length);
    copyDOM.focus();
    document.execCommand("Copy");
    alert('复制成功!');
}

顿时心情舒畅,今后再遇此种需求,可随手解之
ps:以上函数仅用于input元素

2019.11.04
本猫更新了一个通用的可用于各类元素的函数在github,下载即可使用
https://github.com/DullCat-c/Dull_Copy

相关文章

  • JS-复制功能的填坑之路

    本来这只是我笔记本上的一个小小的code snippet,但是最近拿出来复用的时候不断发现新的坑,所以干脆写篇博客...

  • 填坑之路

    总有一点东西,用一次查一次,查一次忘一次 IE 11不兼容VUE Babel 默认只转换新的 JavaScript...

  • ReactNative填坑之路

    一.ViewPagerAndroid之坑 举个栗子, 然而在HotSaleLis这个Component里面就不能超...

  • 填坑之路:JSTL

    一、什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能,它是apa...

  • idea 填坑之路

    1、jdk与jetty有版本匹配的问题,如果版本不匹配会出现不能识别jsp的错误。 jdk1.8匹配的jett...

  • 填坑之路漫长

    最近怎么说呢,大家都感觉要凉凉了。哪里都是个坑,只不过从这个坑里跳到了另外一个坑里。 好好的填坑,才是自己该做的。...

  • Vue填坑之路

    问题1:TypeError: Cannot read property 'minify' of undefined

  • Jpush的填坑之路

    1. 通知弹不出弹出框,解决方案,想要悬浮弹出框需要在服务端设置priority 为2的优先级 2. 推送通知可以...

  • iOS填坑之2 - 如何工具化自己的开发之路,如何深入,更加深入

    iOS填坑之2 - 如何工具化自己的开发之路,如何深入,更加深入源码地址在这里跟上一篇文章文章iOS填坑之1 - ...

  • 填坑之路:iframe的各种坑

    连着两个项目遇到iframe,难受。 同域还好,不同域简直爆炸。 当然几经折磨,还是有了办法。 解决方案就是让它们...

网友评论

      本文标题:JS-复制功能的填坑之路

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