Vue中进行粘贴板粘贴数据(图片、文字等)

在页面中如果需要进行粘贴数据,那么就要读取系统粘贴板clipboard,通过此Api来进行粘贴板数据的操作。

目录:

  • 一.封装相关函数
    • 1.示例代码:
    • 2.代码解释:
  • 二.页面中进行粘贴
    • 1.代码示例:
    • 2.代码解释:
  • 三.运行结果

一.封装相关函数

1.示例代码:

let Instance = null;class NavtiveBridge {constructor() {// 判断环境this.platform = (navigator.userAgent.match(/(Electron)/i) || (/macintosh|mac os x/i.test(navigator.userAgent))) && !!(window.ipcRenderer && window.shell && window.remote)//根据环境选择相关this.clipboard = this.platform ? window.clipboard : window.navigator.clipboardthis.clipboard.readAvailableFormats = ()=>{if(this.platform){return Promise.resolve(window.clipboard.availableFormats())}else{return new Promise(async(resolve, reject)=>{try {let clipboardItem = await window.navigator.clipboard.read()resolve(clipboardItem[0] ? clipboardItem[0].types : [])} catch (error) {reject(error)}})}}this.setClipboardWrite()}//写入剪切板setClipboardWrite(){if(!this.platform){const originalWriteText = navigator.clipboard.writeText;this.clipboard.writeText = async (text)=>{// 是否授权const { state } = await navigator.permissions.query({ name: "clipboard-write", });if(state === 'granted'){return originalWriteText.apply(navigator.clipboard,[text])}else{return Promise.resolve()}}}else{const originalWriteText = window.clipboard.writeText;this.clipboard.writeText = async (text)=>{originalWriteText.apply(window.clipboard,[text])return Promise.resolve()}}}// 读取复制的值async readText(){if(!this.platform){return  await this.clipboard.readAvailableFormats()}else{return await this.clipboard.read()[0].types}}
}
if (!Instance) {Instance = new NavtiveBridge();
}
//导出
export default Instance;

2.代码解释:

  1. 首先定义了一个变量 Instance,用于存储 NavtiveBridge 类的实例。如果 Instance 为空,则创建一个新的 NavtiveBridge 实例并赋值给 Instance,以保证只有一个 NavtiveBridge 实例存在。

  2. NavtiveBridge 类的构造函数通过检测用户代理字符串来确定当前运行环境是否支持本地原生功能(如 Electron 桌面应用或者 Mac 上的 Web 应用)。如果支持本地原生功能,则使用本地原生的剪贴板 API,否则使用 Web 标准的剪贴板 API。在构造函数中,还调用了 setClipboardWrite() 方法来设置写入剪贴板的方法。

  3. setClipboardWrite() 方法用于设置写入剪贴板的方法。如果运行环境支持本地原生功能,则直接调用本地原生的写入剪贴板方法;否则使用 Web 标准的写入剪贴板方法,并在写入前检查权限。

  4. readText() 方法用于读取剪贴板中的文本。如果支持本地原生功能,则直接调用本地原生的读取剪贴板方法;否则使用 Web 标准的读取剪贴板方法,并返回剪贴板中的文本。

最后通过 export defaultInstance 导出,以便其他模块可以引入并使用该实例。

二.页面中进行粘贴

1.代码示例:

<template><div class="OnePageDemo"><el-button type="primary" @click="pasetText">粘贴</el-button><p>这是复制图片数据:</p><img :src="pasteUrl" style="width: 500px;height: 500px;" alt="" srcset=""></div>
</template><script>
// 导入上述封装的js
import demo from './demo'
export default {name: 'OnePageDemo',data() {return {platform: "",  //平台环境clipboard: "", //粘贴板pasteUrl: ""  //链接};},mounted() {},methods: {async pasetText() {let clipboard = demo.clipboardlet clipboardType = await clipboard.readAvailableFormats()let readText = await clipboard.readText()// 输入框粘贴let excelArr = ['text/plain', "text/html", "text/rtf", "image/png"]   //excel格式let num = 0excelArr.forEach(e => {!clipboardType.includes(e) && (num += 1)})if (clipboardType.includes("image/png")) {const clipboardItems = await clipboard.read()for (const clipboardItem of clipboardItems) {for (const type of clipboardItem.types) {// 筛选图片类型的文件const blob = await clipboardItem.getType(type)this.pasteImg(blob)}}}else{console.log(readText,'这是文本数据');}},pasteImg(blob) {let self = this;// blob 就是从剪切板获得的文件 可以进行上传或其他操作var imgs = new Image();var reader = new FileReader();reader.onload = (function (aImg) {return function (e) {self.pasteUrl = e.target.result;};})(imgs);reader.readAsDataURL(blob);}}
}
</script>

2.代码解释:

  1. pasetText 方法是一个点击按钮后触发的方法,用于从剪贴板中读取数据,并根据数据类型进行处理。如果剪贴板中包含图片数据,则调用 pasteImg 方法进行处理;如果剪贴板中是文本数据,则直接打印出来。
  2. pasteImg 方法用于处理粘贴的图片数据,它接受一个 blob 参数,该参数是从剪贴板获得的文件。在方法内部,创建一个新的 Image 对象和一个 FileReader 对象,使用 FileReader 对象将 blob 转换成 Data URL,然后将 Data URL 赋值给 pasteUrl 属性,以在页面上展示图片。

三.运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/690535.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用html和css实现个人简历表单的制作

根据下列要求&#xff0c;做出下图所示的个人简历&#xff08;表单&#xff09; 表单要求 Ⅰ、表格整体的边框为1像素&#xff0c;单元格间距为0&#xff0c;表格中前六列列宽均为100像素&#xff0c;第七列 为200像素&#xff0c;表格整体在页面上居中显示&#xff1b; Ⅱ、前…

Ansible----playbook模块之templates模块、tags模块、roles模块

目录 引言 一、templates模块 &#xff08;一&#xff09;关键信息 &#xff08;二&#xff09;实际操作 1.定义主机组 2.设置免密登录 3.分别建立访问目录 4.定义模板文件 5.创建playbook文件 6.执行剧本 7.验证结果 二、tags模块 &#xff08;一&#xff09;创建…

i春秋-GetFlag

题目 考点 sql注入&#xff0c;md5加密&#xff0c;代码审计&#xff0c;利用eval函数 解题 参考wp https://www.cnblogs.com/qiaowukong/p/13630130.html找md5值 看见验证码中的提示&#xff0c;就是去找一个md5值前六位是指定值的数&#xff08;严格来说不一定是数&…

虚拟化技术 安装和配置StartWind iSCSI目标服务器

一、实验内容 安装StartWind iSCSI目标服务器配置StartWind iSCSI目标服务器 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装vSphere Client已创建虚拟机并在其上安装CentOS6.5StarWind安装介质starwind.…

系统分析师论文——论软件需求分析方法和工具的选用

现已临近2024年软考&#xff0c;周围一些报名参加系统分析师考试的“小伙伴”还未准备论文&#xff0c;我分享早年写的一些内容&#xff08;包括参加继续教育准备的论文&#xff09;&#xff0c;仅供大家结合最新考纲要求酌情参考&#xff0c;希望予人玫瑰&#xff0c;手有余香…

N5183B是德科技n5183b信号源

181/2461/8938产品概述&#xff1a; 简  述&#xff1a; N5183B 频率范围&#xff1a;9 kHz 至 20 GHz&#xff0c;具有 AM、FM、相位调制功能。N5183B MXG X 系列微波模拟信号发生器拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;以及接近 PSG 级别的相位噪声性能&…

飞书API(8):MySQL 入库定制版本

一、引入 通用版能解决百分之八九十的任务&#xff0c;剩下的部分任务需要进行定制。 先说明通用版本和定制版本有什么不同&#xff0c;通用版本就是只管大的数据类型&#xff0c;将数据处理为对应的类型入库&#xff0c;而定制版本会考虑局部列的数据类型&#xff0c;。举个…

政安晨:【Keras机器学习示例演绎】(四十三)—— 使用 KerasNLP 实现英语到西班牙语的翻译

目录 简介 设置 下载数据 解析数据 数据标记化 格式化数据集 建立模型 训练我们的模型 解码测试句子&#xff08;定性分析&#xff09; 解码测试句子&#xff08;定性分析&#xff09; 评估我们的模型&#xff08;定量分析&#xff09; 10 个轮次后&#xff0c;得分…

PostgreSQL的学习心得和知识总结(一百四十三)|深入理解PostgreSQL数据库之Support event trigger for logoff

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

auto->decltype

auto c11标准才有的,c14丰富了很多这个相关的用法 声明变量别用auto,auto是让编辑器来自己推断,很影响运行效率 #include<iostream> using namespace std;auto ave(int a, int b) {return a b; }int main() {cout << typeid(ave(1, 2)).name()<<endl;ret…

TMS320F280049 CLB模块--FSM(3)

功能框图 FSM有效状态机内部框图如下图所示&#xff0c;可以看到内部有S0 / S1两个状态和下一状态的跳转查找表。还有个输出查找表。 下图是FSM LUT的示意框图。FSM还可以工作在3输入或4输入的查找表模式下。对于输入&#xff0c;EXTRA_EXT_IN1/0可以替换S0/1。 寄存器 参考文…

Java - Json字符串转List<LinkedHashMap<String,String>>

需求&#xff1a;在处理数据时&#xff0c;需要将一个Object类型对象集合转为有序的Map类型集合。 一、问题 1.原代码&#xff1a; 但在使用时出现报错&#xff1a; Incompatible equality constraint: LinkedHashMap<String, String> and LinkedHashMap 不兼容的相等…