user-select: none 必须写全浏览器前缀才生效,需同时设置 -webkit-user-select、-moz-user-select、-ms-user-select 及标准写法;应作用于具体容器而非 body;该属性仅阻止鼠标选中,不拦截 Ctrl+C 或右键复制,且无法真正保护敏感数据。
只在 CSS 里写 user-select: none,在旧版 Chrome、Safari 或 Firefox 中大概率无效。必须显式补全所有前缀:-webkit-user-select: none(Chrome/Safari/Edge)、-moz-user-select: none(Firefox)、-ms-user-select: none(IE/旧 Edge),再加标准写法。否则用户一拖就选中,复制照常。
把防复制逻辑绑定到特定元素(比如 <div id="article-content">),而不是盲目套在 body 上。否则会误伤表单控件——input 和 textarea 即使设了 user-select: none,浏览器也会自动忽略,但视觉干扰和焦点异常仍可能发生。
body { ... },后续还得单独给按钮、输入框重置 user-select: auto
直接对 document 绑 copy 并调 e.preventDefault(),会导致所有输入框无法复制粘贴,实际体验极差。关键是要识别当前焦点是否落在可交互元素上:
document.activeElement 判断,而非 e.target——后者在点击空白处时可能误判input、textarea、[contenteditable="true"]
copy 事件支持不稳定,部分机型根本不触发,不能依赖它作为唯一防线禁用右键菜单不是目的,防止文字被“复制”才是。无差别 e.preventDefault() 会同时干掉“在新标签页打开链接”“保存图片”等合理操作,损害可访问性和 SEO。
p、span)禁右键a、button、input、textarea、select、[contenteditable]
oncontextmenu="return false" 已被现代框架废弃,且无法动态控制范围document.body.innerText、Elements 面板、禁用 JS 或直接查看源码拿到全部文本。防复制不是安全手段,而是提高普通用户复制门槛的辅助策略;敏感数据必须靠服务端权限控制和内容分发策略兜底。