剪贴板在生产力平台上有很高的使用频率。剪贴板API在主流的浏览器上也已经有了不错的支持率。基于前端技术的生产力工具就需要考虑接入这些的能力。

技术上可以实现的场景有:

  • 在onpaste事件读取剪贴板内容
  • 在oncopy事件中可以阻止默认行为、写入自定义数据到剪贴板……
  • 在onclick等事件中,可以用js程序执行剪贴板写入

这些技术场景可以支持到的业务场景比如:

  • word文本粘贴到页面(支持plain text、html、rtf等格式)
  • 图片、音频、视频文件粘贴到网页
  • 用户复制文本时,加入版权提示
  • 禁止用户复制文本、复制行为的检测
  • 点击按钮复制数据到剪贴板
  • 复制react组件的状态到另一个组件

接下来就来看看具体的实现

React App​roughwin.github.io

复制外部资源到浏览器

在浏览器的onpaste事件中,可以取到一个DataTransfer类型的字段event.clipboardData。通过它就可以获取的粘贴进浏览器的资源信息。我们把这个过程封装成通用的函数。

function readDataTransferItemAsString(item) {return new Promise(function (resolve) {item.getAsString(resolve);})
}
async function getClipboardData(data) {const { items } = data;const result = {};await Promise.all([...items].map(async item => {console.log(item)const { type, kind } = item;if (kind === 'string') {result[type] = await readDataTransferItemAsString(item);} else if (kind === 'file') {result[type] = item.getAsFile();}}))console.log(result)return result;
}
function handlePaste(e) {getClipboardData(e.clipboardData).then(setClipInfo)
}document.removeEventListener('paste', handlePaste);

在OneNote复制一段文本到浏览器:

可以看到,粘贴进来的信息同时包括了text/plain、text/html、text/rtf、image/png三种格式,可以根据自己的业务需要选择使用。

阻止并替换浏览器的默认行为

有时候我们希望保护页面内容不被复制。可以在document上监听oncopy事件。例如:

function handleCopy(e) {e.preventDefault()const { clipboardData } = eclipboardData.clearData();clipboardData.setData('text/plain', '版权保护中')
}
document.addEventListener('copy', handleCopy)

这时但我们在页面上选择文本并复制时:

默认行为被改写了,粘贴板被清空并填入了我们设置好的文案。

点击按钮复制

function handleClick(e) {function handleCopy(e) {e.preventDefault()const { clipboardData } = eclipboardData.clearData();const msg = `code: ${Math.random().toString().slice(2, 10)}ncopied at: ${new Date().toISOString()}`;clipboardData.setData('text/plain', msg);document.removeEventListener('copy', handleCopy);setResult(msg)}document.addEventListener('copy', handleCopy)document.execCommand('copy');
}

在Demo2点击按钮,就自动把一段文本写入了剪贴板

注意:document.execCommand('copy');这个操作只在特定的事件(比如onClick)响应函数内才会生效。

复制一个组件的状态到另一个组件

我写了两个React组件,其中剪贴板相关的状态逻辑封装成了useClipboardData

import { useState, useEffect } from 'react';function readDataTransferItemAsString(item) {return new Promise(function (resolve) {item.getAsString(resolve);})
}async function getClipboardData(data) {const { items } = data;const result = {};await Promise.all([...items].map(async item => {console.log(item)const { type, kind } = item;if (kind === 'string') {result[type] = await readDataTransferItemAsString(item);} else if (kind === 'file') {result[type] = item.getAsFile();}}))console.log(result)return result;
}export function useClipboardState(initData) {const [data, setData] = useState(initData);useEffect(function () {async function handlePaste(e) {const d = await getClipboardData(e.clipboardData);if (d && d['text/custom']) {try {setData(JSON.parse(d['text/custom']))} catch (e) {console.log('paste failed.')}}}function handleCopy(e) {e.preventDefault()const { clipboardData } = eclipboardData.clearData();clipboardData.setData('text/custom', JSON.stringify(data))}document.addEventListener('copy', handleCopy)document.addEventListener('paste', handlePaste);return function () {document.removeEventListener('paste', handlePaste);document.removeEventListener('copy', handleCopy)}}, [data]);return [data, setData]
}

在Demo3页面可以按下Ctrl+C复制它的状态到剪贴板,到Demo4页面按下Ctrl+V粘贴。同时,序列化以后的状态信息也支持通过邮件、聊天框等工具发送。这种交互逻辑可以极大的方便用户操作。

最后

以上就是我总结的几个剪贴板API应用场景。这些API已经在我负责的项目(富文本编辑、试卷排版系统)中投入使用,并获得了用户好评。有需要的同学可以参考。

js打开页面自动复制文本到剪贴板_浏览器剪贴板API的应用相关推荐

  1. js打开页面自动复制文本到剪贴板_word基本编辑的方法?word基本知识文件操作和文本编辑?...

    Word基础文本编辑知识教程: 1.文字编辑功能 所有的基本文本编辑功能都位于"主页"功能区选项卡中. 请注意,Word在"主页"选项卡的"字体&qu ...

  2. js打开页面自动复制文本到剪贴板_摆脱低效复制粘贴,使用 Ditto 提高效率

    ​Ditto 是非常强大的 Windows 剪贴板增强工具,支持 64 位操作系统,完全免费,绿色开源,支持中文. 整理&排版 | idea君 ,预计阅读需 | 10分钟 文章意在学习交流分享 ...

  3. Clipboard.js – 现代方式实现复制文本到剪贴板

    复制文本到剪贴板应该并不难,目前已经有很成熟的 Flash 方法.但是 Flash 已经在很多场合不适用了,特别是随着 HTML5 技术的发展.今天推荐的这个 Clipboard.js 库不依赖 Fl ...

  4. 打开页面自动强制QQ对话

    打开页面自动强制QQ对话 <meta http-equiv="refresh" content="0; url=tencent://AddContact/?from ...

  5. js实现页面自动跳转

    本文导读:自动转向,也叫自动重定向.自动跳转,指当访问用户登陆到某网站时,自动将用户转向其它网页地址的一种技术.转向的网页地址可以是网站内的其它网页,也可以是其它网站.通常情况下,浏览器会收到一个网页 ...

  6. 网页自动切换html css js,HTML页面自动清理js、css文件的缓存(自动添加版本号)_HTML/Xhtml_网页制作...

    这篇文章主要介绍了HTML页面自动清理js.css文件的缓存(自动添加版本号),小编觉得挺不错的,现在分享给大家HTML源码,也给大家做个参考.对HTML感兴趣的小伙伴们一起跟随小编过来看看吧 在we ...

  7. js方法点击复制文本

    copy(data) { //复制文本let url = data;let oInput = document.createElement('input');oInput.value = url;do ...

  8. bootdo项目,js打开页面为新的tab页

    bootdo 打开新页面为新的tab页 contabs.js 最后添加一下代码 * 新增一个选项卡* url :选项卡的内容(跳转的地址)* title:选项卡的标题* size: name的ifra ...

  9. Android studio 实现背景音乐(打开页面自动循环播放)

    第一步:在res目录中创建raw文件,并在文件里放入MP3音频 第二步:创建Java文件 MusicServer.java 代码如下: package com.example.jiachat01;im ...

最新文章

  1. 解码大脑:改善BCI稳定性
  2. Mysql自动备份脚本
  3. BZOJ1003: [ZJOI2006]物流运输
  4. [递归][DP]n条直线最多分平面为几部分?
  5. centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′
  6. php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?
  7. 使用ORACLE生成随机数
  8. 服务器磁盘性能表现在,09计算机等级考试试题.doc
  9. leaflet自定标签json_Windows Terminal更新后,自定义配置失效?快捷键无法使用?
  10. 装饰效果(最大连续字段和)
  11. mysql 单精度和双经度,mysql – 计算距离给定2点,纬度和经度
  12. 拓端tecdat|R语言K-means和层次聚类分析癌细胞系微阵列数据和树状图可视化比较
  13. 排序(2)二分排序、快速排序、归并排序
  14. 第2章 大数据处理架构Hadoop
  15. 谷歌最新版本浏览器如何兼容flash插件
  16. canvas画钟表demo
  17. 香港电讯将构建光纤超高速公路
  18. SOFA Weekly | MOSNSOFARPC 发布、社区活动报名
  19. UE4 实现C++蓝图接口
  20. 易语言MySQL静态编译,我说易语言静态编译太强大……

热门文章

  1. NVIDIA官方中文版GPU编程指南v2.20(转载自GZeasy)
  2. matlab 一条水平线,matlab画一条水平线
  3. WKT创建shapefile、shapefile输出WKT
  4. AutoJs学习-趣玩版跳一跳相关代码
  5. 免费开源HC小区物业管理系统
  6. 内存条玄学之四槽插满就这么难么?
  7. 小程序(二十五)微信小程序富文本编辑器editor上传图片
  8. 随机优化和鲁棒优化的区别
  9. next和nextLine的区别
  10. 机载计算机系统教材,机载计算机系统故障诊断.pdf