浏览器剪切板操作:点击图片复制功能;

469 阅读1分钟

大致介绍:

API: navigator.clipboard   —在https下生效,返回一个可以读写剪切板内容的clipboard对象;

以下代码使用 navigator.clipboard 来访问系统剪切板,以读取系统剪切板的内容。

navigator.clipboard.readText().then(
  clipText => document.querySelector(".cliptext").innerText = clipText
);

项目中使用:

// 1.下载使用dom-to-image;
const canvasPoster = {
    initDomtoPng(dom) {
        // 在safari上面需要提前绘制初始化一次,否则异步的图片内容第一次会绘制丢失为空;
        return domtoimage.toPng(dom);
    },
    async downloadPoster(dom, downloadName = '') {
        const canvasLink = await this.initDomtoPng(dom);
        this.copyPoster(canvasLink);
        download(canvasLink, `${downloadName}.png`); // a标签下载到方法封装
    },
    copyPoster(link) { // 将海报复制到系统剪切板
        const img = new Image();
        img.src = link;
        img.crossOrigin = 'anonymous';
        img.onload = () => {
            copyToClipboard(img); // 剪切板方法封装
        };
    },
    urlProxy(url) { // bff代理,微信头像等跨域图片的转发
        return `${window.location.origin}/b/api/proxy/file?url=${encodeURIComponent(url)}`;
    }
};

// 2.a标签下载到方法封装
export async function download(
    link: string,
    filename: string
) {
    const { origin: downloadOrigin } = new URL(link);
    const { origin: siteOrigin } = location;
    // 如果下载的资源,不是在同一个域名下,a标签download设置无效,需要先将资源转为blob,在本地下载
    if (downloadOrigin !== siteOrigin || !canUseSaveLink) {
        await fetch(link)
            .then(res => res.blob())
            .then(blob => downloadBlob(blob, filename));
        return;
    }
    a.href = link;
    a.download = filename;
    a.target = '_blank';
    click(a);
}
// 3.剪切板方法封装
export async function copyToClipboard(img) {
    // https 下生效
    if (navigator.clipboard) {
        const cvs = image2Canvas(img);
        const blob = await new Promise((resolve, reject) => {
            cvs.toBlob(resolve);
        });
        await navigator.clipboard.write([
            // eslint-disable-next-line no-undef
            new ClipboardItem({
                [blob.type]: blob,
            }),
        ]);
    }
    else {
        const selection = window.getSelection();
        selection.removeAllRanges();
        const range = document.createRange();
        range.selectNode(img);
        window.getSelection().addRange(range);
        document.execCommand('Copy');
        selection.removeAllRanges();
    }
}
// 4.canvas绘制img方法封装
export function image2Canvas(img: HTMLImageElement) {
    const cvs = document.createElement('canvas');
    cvs.width = img.width;
    cvs.height = img.height;
    const ctx = cvs.getContext('2d');
    ctx.drawImage(img, 0, 0, cvs.width, cvs.height);
    return cvs;
}

navigator.clipboard参考网址:developer.mozilla.org/zh-CN/docs/…

clipboard参考网址:www.ruanyifeng.com/blog/2021/0…

createRange参考网址:www.cnblogs.com/lijinwen/p/…