首页 > 其他分享 >js实现复制粘贴

js实现复制粘贴

时间:2023-06-12 18:00:30浏览次数:43  
标签:return 实现 text js 复制粘贴 clipboard console navigator document

在一些页面里,有时候会需要用户点击按钮或者控件需要把一些文字内容写入用户设备的剪切板里。在js中如何通过代码实现?接下来是两种实现方法!

使用document.execCommand API

注意 document.execCommand API 是同步执行,如果数据量大 可能会阻塞页面加载,这种办法能兼容老版本浏览器和大部分浏览器。

/**
 * 将文字写入剪切板 
 * @param {string} text
 * @returns {boolean} 返回执行结果
 */
function exeCommandCopyText(text) {
    try {
        const t = document.createElement('textarea')
        t.nodeValue = text
        t.value = text
        document.body.appendChild(t)
        t.select()
        document.execCommand('copy');
        document.body.removeChild(t)
        return true
    } catch (e) {
        console.log(e)
        return false
    }
}
  • vue中使用
<template>
    <div>
        <button @click="cpoy">点击复制文字内容</button>
    </div>
</template>

<script>
    function exeCommandCopyText(text) {
        try {
            const t = document.createElement('textarea')
            t.nodeValue = text
            t.value = text
            document.body.appendChild(t)
            t.select()
            document.execCommand('copy');
            document.body.removeChild(t)
            return true
        } catch (e) {
            console.log(e)
            return false
        }
    }
    export default {
        methods: {
            cpoy() {
                let content = `123
            456
            789` // 包含了换行符
                let flag = exeCommandCopyText(content)
                console.log(flag ? "复制成功" : "复制失败")
            }
        }
    }
</script>

使用navigator.clipboard API

使用前需注意:在安全的网站中可以通过访问 navigator.clipboard 。这里的安全网站是指:https协议的网站或者 本地localhost ,不然访问 navigator.clipboard 会返回undefined。此API比较新,在现代主流浏览器支持(最早2018年)。

/**
 * 将文字写入剪切板 
 * @param {string} text
 * @returns {Promise} 返回promise对象
 */
function clipboardCopyText(text) {
    // 在调用前 先访问是否存在 clipboard 对象
    if (navigator.clipboard) {
        return navigator.clipboard.writeText(text)
    }
    return Promise.reject("无法访问 navigator.clipboard 对象")
}

let str = `
你快乐吗?
我很快乐!
`
clipboardCopyText(str).then(() => {
    console.log("复制成功到剪切板");
}).catch(err => {
    console.log("复制失败了");
})

结合使用

因为 document.execCommand 将要废弃,所以在新版本浏览器可能会无法正常使用。 MDN 推荐使用navigator.clipboard。所以可以组合新老API,去支持大部分的新旧浏览器。

/**
 * 将文字写入剪切板 
 * @param {string} text
 * @returns {Promise} 返回promise对象
 */
function copyText(text) {
    // 在调用前 先访问是否存在 clipboard 对象
    if (navigator.clipboard) {
        return navigator.clipboard.writeText(text)
    } else {
        // 不存在使用 老版本API execCommand
        try {
            const t = document.createElement('textarea')
            t.nodeValue = text
            t.value = text
            document.body.appendChild(t)
            t.select()
            document.execCommand('copy');
            document.body.removeChild(t)
            return Promise.resolve()
        } catch (e) {
            console.log(e)
            return Promise.reject(e)
        }
    }
}

copyText("今天晚上吃什么?").then(() => {
    console.log("复制成功!");
}).catch(() => {
    console.log("复制失败");
})

标签:return,实现,text,js,复制粘贴,clipboard,console,navigator,document
From: https://www.cnblogs.com/kongyijilafumi/p/17475745.html

相关文章

  • js 0.07*100竟然是7.000000000000001
    无意中发现了一个问题:0.07*100=7.000000000000001,而不是7。 结果为什么是7.0000000000000001? 其实JavsScript中,变量在存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE754-2008标准定义的64bit浮点格式存储number,按照IEEE754的定义:http://en......
  • Python利用jsonpickle库把对象序列化为json
    python中经常要保存一些数据,json是一种理想的存储格式,纯文本的,也方便阅读,但有时使用起来不太方便,比如下面的例子:a=jsonData['A']b=jsonData['B']只能按字典方式引用,还不支持自动完成,不如python对象使用方便.如果定义python类,使用方便,但是保存为文件时......
  • Jenkins Pipeline 密钥实现远程部署
    前提:已配置jenkins秘钥凭证 一、配置流程1.1片段生成1、按如下图选择2、新增密钥信息1.2脚本配置以上配置完成后,接下来就可以在Jenkinsfile中配置了,:stages{stage('xx启动'){steps{echo"xx启动"dir("${SRC_PATH}")......
  • Redis高可用的三种实现方式
    Redis高可用的三种实现方式一、高可用的概念​高可用(HighAvailability,即HA),指的是通过尽量缩短日常维护操作和突发的系统崩溃所导致的停机时间,以提高系统和应用的可用性。一个业务系统如果全年无一时刻不在提供服务,它的可用性可达100%。那么什么样的系统可以称之为高可用呢,业......
  • os模块、序列化模块、pickle和json的区别
    os模块#os模块是与操作系统交互的一个接口1.文件相关的os.makedirs('dirname1/dirname2')#可生成多层递归目录os.removedirs('dirname1')#若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推os.mkdir('dirname')#生成单级目录;相当于shell中mkd......
  • 如何实现不同服务器之间 大体量的数据自动同步?
    随着企业结构分散化的不断扩大,企业的数据中心、服务器节点、异地分支机构之间,会存在多种文件交换场景。传统的FTP、rsync、网盘等传输方式在数据体量较小、时效性要求不高的情况下,基本也可以满足需求。但随着数量爆发式增长,需要及时分析使用数据的情况下,就不太够用了,弊端也随之体......
  • .net core 微服务 集成Ocelot 和Nacos 之后使用grpc 如何实现服务与服务之间的调用
    在.NETCore微服务中使用gRPC调用其他服务,你需要完成以下步骤:1.定义服务契约:你需要定义你的服务、方法以及消息类型,以便客户端和服务端协商通信。2.生成代码:你需要使用gRPC工具生成客户端和服务端的代码,这样你就可以在应用程序中使用它们。3.实现服务:你需要实现......
  • java实现dwg转pdf
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、无奈选择第二种二、jar引入1.jar地址2.使用jar,完成dwg转为pdf总结前言由于公司需要最近研究一个cad文件需要在浏览器中展示,经过研究发现大致有两种方式:1将.dwg转换为vds文件,就可以在web端展示......
  • redis的消息发布订阅实现
    文章目录前言一、创建好springboot项目,引入核心依赖二、使用步骤1.自定义一个消息接受类2.声名一个消息配置类3.编写一个测试类总结前言一般项目中都会使用redis作为缓存使用,加速用户体验,实现分布式锁等等,redis可以说为项目中的优化,关键技术实现立下了汗马功劳.今天带来它......
  • vue实现简单的鼠标拖拽横向滚动 和 鼠标滚轮横向滚动
    一.鼠标拖拽滚动以下代码项目中直接使用即可,此种方法是通过鼠标拖拽进行滚动,滑动滚轮无效果。当然快捷键,shift+鼠标滚轮可以控制横向滚动,对用户来说体验不友好。<divclass="tab-listid="nav"><divclass="tab-item"v-for="(item,index)inlist":key=""></div></d......