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

news2024/12/24 9:54:26

在页面中如果需要进行粘贴数据,那么就要读取系统粘贴板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.clipboard
    this.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.clipboard
            let clipboardType = await clipboard.readAvailableFormats()
            let readText = await clipboard.readText()
            // 输入框粘贴
            let excelArr = ['text/plain', "text/html", "text/rtf", "image/png"]   //excel格式
            let num = 0
            excelArr.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.coloradmin.cn/o/1665894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C数据结构:队列

目录 队列是什么&#xff1f; 队列的实现 队列的数据结构 队列的初始化 队列的插入 队列的删除 获取队列队头元素 获取队列队尾元素 获取队列元素个数 检查队列是否为空 队列的销毁 队列的使用 完整代码 队列是什么&#xff1f; 队列也是顺序表中的一种 队列和栈…

Python-VBA函数之旅-staticmethod函数

目录 一、staticmethod函数的常见应用场景 二、staticmethod函数使用注意事项 三、如何用好staticmethod函数&#xff1f; 1、staticmethod函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog…

Linux(Ubuntu24.04) 安装 MinIO

本文所使用的 Ubuntu 系统版本是 Ubuntu 24.04 ! # 1、下载 MinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio# 2、添加可执行权限 chmod x minio# 3、导出环境变量&#xff0c;用于设置账号密码&#xff0c;我设置的账号和密码都是 minioadmin export MI…

【数据结构练习题】Map与Set——1.只出过一次的数字2.复制带随机指针的链表3.宝石与石头4.坏键盘打字

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ ♥♥♥♥♥【数据结构练习题】堆——top-k问题♥♥♥♥♥ 文章目录 1.只出过一次的数字1.1问题描述1.2思路分析1.3绘图分析1.4代码实现2.复制带随机指针的链表2.1问题描述2.2思路分析2.3绘图分析2.4代…

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么&#xff1f;重复的机械操作。我们刚接…

【AI+老照片焕新】母亲节用AI把时间的印记变成暖心礼物

想念是一张泛黄的照片&#xff0c;藏在抽屉里的笑容&#xff0c;总是那么亲切。今天是母亲节&#xff0c;是不是想给妈妈来点不一样的惊喜&#xff1f;用AI技术&#xff0c;把那些老照片瞬间焕新&#xff0c;让妈妈的青春记忆重放光华&#xff01; 想象一下&#xff0c;妈妈年…

vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3vue3

纯vue3的语法 一.创建&#xff08;基于vite&#xff09; 1.在指定目录下运行 npm create vuelatest 项目名称&#xff1a;英文小写下划线数字回车表示确定是、否 左右切换路由、pina、单元测试、端到端的测试、开启eslint控制代码质量 先选择no&#xff0c;学的时候自己手动…

4---自动化构建代码(逻辑梳理,轻松理解)

一、需求引出&#xff1a; 在使用编译器编译代码时&#xff0c;无论我们在一个项目中写了多少个文件(包括头文件、源文件)&#xff0c;我们都可以一键完成编译&#xff0c;编译器会自动处理各个文件之间的包含&#xff0c;调用关系。但是在Linux中&#xff0c;我们在一个目录下…

Docker in Docker(DinD)原理与实战

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker幻想曲&#xff1a;从零开始&#xff0c;征服容器宇宙》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Docker简介 2、Docker …

Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 1.前言 我们在前面的文章讲解了Kubernetes的核心概念和服务部署&#x…

08.3.grafana自定义图形

grafana自定义图形 找插件里面的zabbix 点击update 数据源—zabbix数据源,添加zabbix数据源 选择zabbix类型 我这里配置的是本地&#xff0c;所以URL直接localhost 这里配置zabbix登录账号密码Admin/zabbix 然后点击保存并测试&#xff0c;会直接显示版本 导入模板&…

JavaSE——集合框架一(1/7)-集合体系概述(集合体系结构,Collection集合体系)、Collection的常用方法(介绍,实例演示,代码)

目录 集合体系概述 集合体系结构 Collection集合体系 Collection的常用方法 介绍 实例演示 完整代码 集合体系概述 集合体系结构 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。 为了满足…

ACM 的代码编码示例

写在最前面的 实践的顺序&#xff0c; 应该是先将基础的 数据结构题目类型给实现。 然后再开始尝试 实现对应类型的算法题目&#xff0c;如回溯算法&#xff0c; 贪心算法&#xff0c; 动态规划&#xff0c; 图论&#xff1b; 基础的数据结构&#xff0c; 推荐卡尔的&#xff…

【C++】vector的底层原理讲解及其实现

目录 一、认识vector底层结构 二、初始化vector的函数 构造函数拷贝构造赋值构造initializer_list构造迭代器区间构造 三、迭代器 四、数据的访问 五、容量相关的函数 六、关于数据的增删查改操作 一、认识vector底层结构 STL库中实现vector其实是用三个指针来完成的&#x…

PY32F403系列单片机,32位M4内核MCU,主频最高144MHZ

PY32F403系列单片机是基于Arm Cortex-M4核的32位通用微控制器产品。内置的FPU和DSP功能支持浮点运算和全部DSP指令。通过平衡成本&#xff0c;性能&#xff0c;功耗来获得更好的用户体验。 PY32F403单片机典型工作频率可达144MHZ&#xff0c;内置高速存储器&#xff0c;丰富的…

sql注入之bool盲注

目录 盲注步骤 1、进入靶场 2、如下图所示输入&#xff1f;id1‘ 判断此时存在注入点 3、判断列数 ​编辑 4、开始盲注 普通的python脚本 代码思想 结果 二分查找python脚本 二分查找算法思想简介 二分查找与普通查找的主要差距 代码思想 代码 结果​编辑 下面以…

图像融合-下游任务(目标检测、实例分割、深度估计、局部区域细节放大)

下游任务: 采用目标检测、实例分割和深度估计的下游任务来验证图像融合结果质量。 文章目录 下游任务:1.目标检测2.实例分割3.深度估计局部细节放大工具Update1.目标检测 YOLOv8:https://github.com/ultralytics/ultralytics 步骤内容第一步下载项目到本地第二步安装READ…

文献阅读——中国农产品期货的正负价格泡沫(LPPLS)

Positive and negative price bubbles of Chinese agricultural commodity futures Fang, Ming, Yizhou Lin, and Chiu-Lan Chang. “Positive and negative price bubbles of Chinese agricultural commodity futures.” Economic Analysis and Policy 78 (2023): 456-471. 经…

以项目为中心打造企业卓越经营管理体系︱PMO大会

全国PMO专业人士年度盛会 广东林氏家居股份有限公司战略副总裁杨永柠先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“以项目为中心打造企业卓越经营管理体系”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&…

WPS表格:使用vlookup函数解决乱序数据对应问题

我们常常会遇到两个表格的内容相同&#xff0c;但是顺序不一致的情况。并且这种顺序无关于简单的排序&#xff0c;而是一种业务性很强的复杂排序规则。下面我举个例子&#xff0c;使用VLOOKUP复制数据。 假设太阳系行星举办了一次卖萌比赛&#xff0c;由太阳妈妈决定谁是最萌的…