使用 GreaseMonkey 解除网页复制粘贴限制
本文最后更新于:2021年4月15日 下午
吾辈发布了一个油猴脚本,可以直接安装 解除网页限制 以获得更好的使用体验。
场景
在浏览网页时经常会出现的一件事,当吾辈想要复制,突然发现复制好像没用了?(知乎禁止转载的文章)亦或者是复制的最后多出了一点内容(简书),或者干脆直接不能选中了(360doc)。粘贴时也有可能发现一直粘贴不了(支付宝登录)。
问题
欲先制敌,必先惑敌。想要解除复制粘贴的限制,就必须要清楚它们是如何实现的。不管如何,浏览器上能够运行的都是 JavaScript,它们都是使用 JavaScript 实现的。实现方式大致都是监听相应的事件(例如 onkeydown
监听 Ctrl-C
),然后做一些特别的操作。
例如屏蔽复制功能只需要一句代码
1 |
|
是的,只要返回了 false,那么 copy 就会失效。还有一个更讨厌的方式,直接在 body
元素上加行内事件
1 |
|
解决
可以看出,一般都是使用 JavaScript 在相应事件中返回 false,来阻止对应事件。那么,既然事件都被阻止了,是否意味着我们就束手无策了呢?吾辈所能想到的解决方案大致有三种方向
- 使用 JavaScript 监听事件并自行实现复制/剪切/粘贴功能
- 优点:实现完成后不管是任何网站都能使用,并且不会影响到监听之外的事件,也不会删除监听的同类型事件,可以解除浏览器本身的限制(密码框禁止复制)
- 缺点:某些功能自行实现难度很大,例如选择文本
- 重新实现
addEventListener
然后删除掉网站自定义的事件- 优点:事件生效范围广泛,通用性高,不仅 复制/剪切/粘贴,其他类型的事件也可以解除
- 缺点:实现起来需要替换
addEventListener
事件够早,对浏览器默认操作不会生效(密码框禁止复制),而且某些网站也无法破解
- 替换元素并删除 DOM 上的事件属性
- 优点:能够确保网站 js 的限制被解除,通用性高,事件生效范围广泛
- 缺点:可能影响到其他类型的事件,复制节点时不会复制使用
addEventListener
添加的事件注:此方法不予演示,缺陷实在过大
总之,如果真的想解除限制,恐怕需要两种方式并用才可以呢
使用 JavaScript 监听事件并自行实现复制/剪切/粘贴功能
实现强制复制
思路
- 冒泡监听
copy
事件 - 获取当前选中的内容
- 设置剪切版的内容
- 阻止默认事件处理
1 |
|
实现强制剪切
思路
- 冒泡监听
cut
事件 - 获取当前选中的内容
- 设置剪切版的内容
- 如果是可编辑内容要删除选中部分
- 阻止默认事件处理
可以看到唯一需要增加的就是需要额外处理可编辑内容了,然而代码量瞬间爆炸了哦
1 |
|
实现强制粘贴
- 冒泡监听
focus/blur
,以获得最后一个获得焦点的可编辑元素 - 冒泡监听
paste
事件 - 获取剪切版的内容
- 获取最后一个获得焦点的可编辑元素
- 删除当前选中的文本
- 在当前光标处插入文本
- 阻止默认事件处理
1 |
|
总结
脚本全貌
1 |
|
重新实现 addEventListener
然后删除掉网站自定义的事件
该实现来灵感来源自 https://greasyfork.org/en/scripts/41075,几乎完美实现了解除限制的功能
原理很简单,修改原型,重新实现 EventTarget
和 docuement
的 addEventListener
函数
1 |
|
最后,JavaScript hack 技巧是真的很多,果然写 GreaseMonkey 脚本这方面用得很多呢 (๑>ᴗ<๑)