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

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

一.封装相关函数

1.示例代码:

javascript 复制代码
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.代码示例:

javascript 复制代码
<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 属性,以在页面上展示图片。

三.运行结果

相关推荐
大橙子额1 天前
【解决报错】Cannot assign to read only property ‘exports‘ of object ‘#<Object>‘
前端·javascript·vue.js
WooaiJava1 天前
AI 智能助手项目面试技术要点总结(前端部分)
javascript·大模型·html5
LYFlied1 天前
从 Vue 到 React,再到 React Native:资深前端开发者的平滑过渡指南
vue.js·react native·react.js
Never_Satisfied1 天前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌411 天前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家1 天前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
WeiXiao_Hyy1 天前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
xjt_09011 天前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农1 天前
Vue 2.3
前端·javascript·vue.js
辰风沐阳1 天前
JavaScript 的宏任务和微任务
javascript