乐趣区

油猴脚本-快速复制文字到剪切板

原因

由于我太懒了, 不想每次在浏览器里都要鼠标拖很长一串, 然后在 command+c 复制, 所以我想快速复制. 平时双击或三连击选文案的情况还是蛮多的, 所以就决定实现一个油猴的脚本, 这样就可以方便的玩耍了

实现



(function () {
    'use strict';
    window.__copy_text_to_clipboard__ = true;
    // window.__copy_text_to_clipboard__ === true;
    // iframe.contentWindow.__copy_text_to_clipboard__ === undefined
    function copyToClipboard(str) {const textAreaElement = document.createElement('textarea');
        const iframe = this.__copy_text_to_clipboard__ ? document.createElement('iframe') : textAreaElement;
        iframe.style.display = 'none';
        textAreaElement.value = str;
        document.body.appendChild(iframe);
        if (this.__copy_text_to_clipboard__) {iframe.contentDocument.body.append(textAreaElement)
        }
        textAreaElement.select();
        document.execCommand('copy');
        document.body.removeChild(iframe);
    }

    function mouseHandle(event) {
        const detail = event.detail;
        const text = this.getSelection().toString();
        // if the text is empty or click event neither double click nor triple click
        if (!text.trim().length || (detail !== 2 && detail !== 3)) {return;}
        copyToClipboard.call(this, text)
    }

    // notice the dynamic iframes are not queried
    const iframes = document.querySelectorAll('iframe');

    [...iframes].forEach(iframe => {iframe.onload = function () {
            const contentWindow = iframe.contentWindow;
            const contentDocument = iframe.contentDocument;
            // handle iframe copy
            contentDocument.addEventListener('click', mouseHandle.bind(contentWindow));
        }

    })

    document.addEventListener('click', mouseHandle.bind(window));

})();

实现起来很简单, 选中时通过 window.getSelection 获取到选中的文字, 然后执行 document.execCommand('copy') 拷贝到剪切板

copyToClipboard 中有一个判断, 那为什么要有这个判断呢?

原因就是我这个人有强迫症, 如果不用 iframe, 只是用textarea 会造成选中文字的失焦(选中文字不高亮), 所以用了iframe.

理想情况就不需要这个判断, 无论什么情况都用 iframe 来实现拷贝, 但是问题出现了, iframe 在选中时候不会复制到剪切板 因此在iframe 下选中还得用textarea

因为 iframe 不在当前文档中, 因此 iframe 选中的高亮不会因为 textare.select() 而造成失焦

在线 demo(要装油猴插件)

gist 地址

只需要双击想要复制的文字或者三连击选中一长串数字就可以复制到剪切板了

退出移动版