来源网络
一、基本使用
1.1 API 介绍
复制、剪切、粘贴事件
copy发生复制操作时触发;cut发生剪切操作时触发;paste发生粘贴操作时触发
每个事件都有一个
before事件对应:beforecopy、beforecut、beforepaste。这几个before一般不怎么用,所以我们把注意力放在另外三个事件就可以了
触发条件
- 鼠标右键菜单的
复制、粘贴、剪切 - 使用了相应的键盘组合键,比如:
command+c、command+v
使用姿势
以
copy为例
document.body.oncopy = e => { |
上面是在
document.body上全局监听的,然而很多人不知道的是,我们还可以为某些dom单独添加剪切板事件
// html结构 |
其他事件也是一样的
1.2 clipboardData
clipboardData 对象:用于访问以及修改剪贴板中的数据
不同浏览器,所属的对象不同:在
IE中这个对象是window对象的属性,在Chrome、Safari和Firefox中,这个对象是相应的event对象的属性。所以我们在使用的时候,需要做一下如下兼容
document.body.oncopy = e => { |
对象方法
对象有三个方法:
getData()、setData()、clearData()
getData() 访问剪切板中的数据
getData()接受一个text参数,即要取得的数据的格式
在复制、剪切、粘贴触发的事件的数据
实际上在
chorme上测试只有paste粘贴的时候才能用getData()访问到数据,用法如下
// 要粘贴的数据: |
被复制/剪切的数据:
在复制和剪切中的数据,需要通过
window.getSelection(0).toString()来访问:
document.body.oncopy = e => { |
setData(): 修改剪切板中的数据
第一个参数也是
text,第二个参数是要放在剪切板中的文本
clearData()
二、应用
2.1 复制大段文本
实现类知乎/掘金复制大段文本添加版权信息
实现很简单:取消默认复制之后,主要是在被复制的内容后面添加信息,然后根据
clipboardData的setData()方法将信息写入剪贴板
// 掘金这里不是全局监听,应该只是监听文章的dom范围内。 |
然后
command+c、command+v,输出:
你复制的内容 |
2.2 防复制功能
- 禁止复制+剪切
- 禁止右键,右键某些选项:全选,复制,粘贴等。
- 禁用文字选择,能选择却不能复制,体验很差。
user-select用css禁止选择文本
// 禁止右键菜单 |
/** css 禁止文本选择 这样不会触发js**/ |
- 使用
e.preventDefault()也可以禁用,但建议使用return false这样就不用去访问e和e的方法了。 - 示例中
document.body全局都禁用了,也可以对dom(某些区域)进行禁用
破解防复制
上面的防复制方法通过js+css实现的,所以思路就是:禁用js+取消user-select样式。
Chrome浏览器的话:打开浏览器控制台,按F1进入Setting,勾选DisableJavaScript(禁止js)。

此时如果还不能复制的话,就要去找
user-select样式,取消这个样式就可以了
2.3 点击复制功能
不能使用 clipboardData
- 在
IE中可以用window.clipboardData.setData('text','内容')实现 - 上文提到过,在
IE中clipboardData是window的属性 - 而其他浏览器则是相应的
event对象的属性,这实际上是一种安全措施,防止未经授权的访问,为了兼容其他浏览器,所以我们不能通过clipboardData来实现这种操作
具体做法
- 创建一个隐藏的
input框 - 点击的时候,将要复制的内容放进
input框中 - 选择文本内容
input.select()。这里只能用input或者textarea才能选择文本 document.execCommand("copy"),执行浏览器的复制命令
function copyText() { |