js打开页面自动复制文本到剪贴板_浏览器剪贴板API的应用
剪贴板在生产力平台上有很高的使用频率。剪贴板API在主流的浏览器上也已经有了不错的支持率。基于前端技术的生产力工具就需要考虑接入这些的能力。
技术上可以实现的场景有:
- 在onpaste事件读取剪贴板内容
- 在oncopy事件中可以阻止默认行为、写入自定义数据到剪贴板……
- 在onclick等事件中,可以用js程序执行剪贴板写入
这些技术场景可以支持到的业务场景比如:
- word文本粘贴到页面(支持plain text、html、rtf等格式)
- 图片、音频、视频文件粘贴到网页
- 用户复制文本时,加入版权提示
- 禁止用户复制文本、复制行为的检测
- 点击按钮复制数据到剪贴板
- 复制react组件的状态到另一个组件
接下来就来看看具体的实现
React Approughwin.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的应用相关推荐
- js打开页面自动复制文本到剪贴板_word基本编辑的方法?word基本知识文件操作和文本编辑?...
Word基础文本编辑知识教程: 1.文字编辑功能 所有的基本文本编辑功能都位于"主页"功能区选项卡中. 请注意,Word在"主页"选项卡的"字体&qu ...
- js打开页面自动复制文本到剪贴板_摆脱低效复制粘贴,使用 Ditto 提高效率
Ditto 是非常强大的 Windows 剪贴板增强工具,支持 64 位操作系统,完全免费,绿色开源,支持中文. 整理&排版 | idea君 ,预计阅读需 | 10分钟 文章意在学习交流分享 ...
- Clipboard.js – 现代方式实现复制文本到剪贴板
复制文本到剪贴板应该并不难,目前已经有很成熟的 Flash 方法.但是 Flash 已经在很多场合不适用了,特别是随着 HTML5 技术的发展.今天推荐的这个 Clipboard.js 库不依赖 Fl ...
- 打开页面自动强制QQ对话
打开页面自动强制QQ对话 <meta http-equiv="refresh" content="0; url=tencent://AddContact/?from ...
- js实现页面自动跳转
本文导读:自动转向,也叫自动重定向.自动跳转,指当访问用户登陆到某网站时,自动将用户转向其它网页地址的一种技术.转向的网页地址可以是网站内的其它网页,也可以是其它网站.通常情况下,浏览器会收到一个网页 ...
- 网页自动切换html css js,HTML页面自动清理js、css文件的缓存(自动添加版本号)_HTML/Xhtml_网页制作...
这篇文章主要介绍了HTML页面自动清理js.css文件的缓存(自动添加版本号),小编觉得挺不错的,现在分享给大家HTML源码,也给大家做个参考.对HTML感兴趣的小伙伴们一起跟随小编过来看看吧 在we ...
- js方法点击复制文本
copy(data) { //复制文本let url = data;let oInput = document.createElement('input');oInput.value = url;do ...
- bootdo项目,js打开页面为新的tab页
bootdo 打开新页面为新的tab页 contabs.js 最后添加一下代码 * 新增一个选项卡* url :选项卡的内容(跳转的地址)* title:选项卡的标题* size: name的ifra ...
- Android studio 实现背景音乐(打开页面自动循环播放)
第一步:在res目录中创建raw文件,并在文件里放入MP3音频 第二步:创建Java文件 MusicServer.java 代码如下: package com.example.jiachat01;im ...
最新文章
- 解码大脑:改善BCI稳定性
- Mysql自动备份脚本
- BZOJ1003: [ZJOI2006]物流运输
- [递归][DP]n条直线最多分平面为几部分?
- centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′
- php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?
- 使用ORACLE生成随机数
- 服务器磁盘性能表现在,09计算机等级考试试题.doc
- leaflet自定标签json_Windows Terminal更新后,自定义配置失效?快捷键无法使用?
- 装饰效果(最大连续字段和)
- mysql 单精度和双经度,mysql – 计算距离给定2点,纬度和经度
- 拓端tecdat|R语言K-means和层次聚类分析癌细胞系微阵列数据和树状图可视化比较
- 排序(2)二分排序、快速排序、归并排序
- 第2章 大数据处理架构Hadoop
- 谷歌最新版本浏览器如何兼容flash插件
- canvas画钟表demo
- 香港电讯将构建光纤超高速公路
- SOFA Weekly | MOSNSOFARPC 发布、社区活动报名
- UE4 实现C++蓝图接口
- 易语言MySQL静态编译,我说易语言静态编译太强大……