在任何页面上解锁复制、选择和右键
你撞上一篇文章,想把一段复制到你的笔记里 —— 而页面不让你选择文本。右键什么都不做。这不是浏览器的 bug,是页面 JavaScript 里一个有意的封锁。本文展示如何用一条 JustZix 规则移除它。
页面如何阻止复制
HTML 里没有「只读模式」。一个阻止选择的页面用两种方式做到这点:
- CSS —— 在文本元素上用
user-select: none。 - JavaScript —— 对
copy、selectstart、contextmenu事件的处理器,调用preventDefault()。
两者都能被撤销,因为两者都在浏览器里运行 —— 而你对自己的浏览器有完全的控制。
这合法吗?
合法。文本已经在你的屏幕上了 —— 页面把它发给了你。移除复制封锁并没有绕过任何内容保护,因为根本没有;它只是一个 UX 上的讨厌玩意。文本本身的著作权是另一回事 —— 你拿复制的片段做什么,由你决定。
规则 —— CSS 加 JS
把 URL 模式设到讨厌你的那个页面(或全局用 *)。在规则的 JavaScript 标签页里,粘贴:
['copy', 'cut', 'contextmenu', 'selectstart', 'dragstart']
.forEach(evt =>
document.addEventListener(evt, e => e.stopPropagation(), true)
);
const s = document.createElement('style');
s.textContent =
'*{user-select:text!important;-webkit-user-select:text!important}';
document.documentElement.appendChild(s);
它如何工作
捕获阶段的 stopPropagation
addEventListener 的第三个参数设为 true 表示捕获阶段。我们的监听器在事件到达页面处理器之前捕获它,并调用 stopPropagation() —— 传播停止,页面处理器(那个带 preventDefault() 的)永远收不到事件。
注入的 style
第二段加一条带 user-select: text !important 的 CSS 规则。!important 胜过页面任何 user-select: none。我们从 JS 注入它(而不是作为规则的 CSS),好让它恰好落在级联的最末端,确保获胜。
纯 CSS 变体
如果封锁纯粹是 CSS 的,JS 就没用了 —— 规则的 CSS 标签页就够了:
* { user-select: text !important; -webkit-user-select: text !important; }
先试这个。如果选择还是不行,那页面在 JS 里也封锁了,你需要完整版本。
坑
- 密码字段。有些页面故意阻止复制
password字段 —— 那个封锁可能是合理的,留着它。 - 之后加载的内容。注入的
<style>也覆盖启动后才加进 DOM 的元素 —— 它对 SPA 有效。 - 这不绕过付费墙。解锁选择揭示的是你已经有的文本。它不会发现藏在登录背后的内容。
另见
- 示例 —— 这段和其他开箱即用的代码
- 自定义键盘快捷键 —— 另一种事件监听器模式
- 隐藏 cookie 横幅 —— 用于碍事元素的 CSS
安装 JustZix —— 从每个想阻止你的页面上复制。
为这篇文章评分
暂无评分 — 成为第一个。