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

三.运行结果

相关推荐
渣哥15 分钟前
代理选错,性能和功能全翻车!Spring AOP 的默认技术别再搞混
javascript·后端·面试
WeilinerL36 分钟前
泛前端代码覆盖率探索之路
前端·javascript·测试
咖啡の猫1 小时前
Vue 实例生命周期
前端·vue.js·okhttp
JNU freshman1 小时前
vue 之 import 的语法
前端·javascript·vue.js
剑亦未配妥1 小时前
Vue 2 响应式系统常见问题与解决方案(包含_demo以下划线开头命名的变量导致响应式丢失问题)
前端·javascript·vue.js
爱吃的强哥1 小时前
Vue2 封装二维码弹窗组件
javascript·vue.js
凉柚ˇ1 小时前
Vue图片压缩方案
前端·javascript·vue.js
ByteCraze2 小时前
秋招被问到的常见问题
开发语言·javascript·原型模式
优弧2 小时前
Vue 和 React 框架对比分析:优缺点与使用场景
vue.js
渣哥2 小时前
从代理到切面:Spring AOP 的本质与应用场景解析
javascript·后端·面试