现代浏览器中无法真正禁止右键菜单,oncontextmenu="return false"仅能拦截普通右键,无法阻止开发者工具、Shift+F10、触摸长按等绕过方式;需配合CSS防选中拖拽,但移动端长按伪右键仍不可控,敏感内容应依赖服务端保护而非前端拦截。
直接禁用右键菜单在现代浏览器中已不可靠,oncontextmenu 只能拦截默认行为,无法阻止用户通过开发者工具、快捷键(如 Shift+F10)或触摸长按触发上下文菜单。
oncontextmenu="return false" 拦截最常见右键触发这是最轻量、兼容性最好的方式,适用于大多数桌面浏览器(Chrome/Firefox/Edge/Safari):
<body oncontextmenu="return false"> <p>页面内容</p></body>
注意:return false 必须写在事件属性内,单独绑定 addEventListener('contextmenu', e => e.preventDefault()) 后仍需调用 e.stopPropagation() 才能避免某些父级监听干扰;若页面有 iframe,需分别对其 contentDocument 设置,否则右键 iframe 内容仍会弹出菜单。
仅禁右键不够——用户可全选文本后复制,或拖拽图片。需配合 CSS 和额外事件:
立即学习“前端免费学习笔记(深入)”;
user-select: none 防止文字选中(但不影响输入框、textarea)-webkit-user-drag: none 防止图片/元素被拖拽(仅 WebKit/Blink 有效)ondragstart="return false" 兜底拦截拖拽事件示例 CSS:
body { user-select: none; -webkit-user-drag: none;}
iOS Safari 和 Android Chrome 中长按会唤起原生菜单(复制/搜索/翻译等),oncontextmenu 完全不生效。目前无标准 API 可禁用,只能弱化影响:
draggable="false" 属性,减少长按时的“保存图片”选项出现概率pointer-events: none 禁用特定区域交互(慎用,会同时禁掉点击)touchstart 并快速 preventDefault(),可能影响滚动,不推荐全局使用本质是平台限制:浏览器厂商不允许网页完全接管系统级交互,这是安全策略,不是代码缺陷。
真正需要保护的内容(如图片、文本)不该依赖前端禁右键,而应走服务端鉴权、水印、分片加载或 DRM 方案;前端拦截只是增加普通用户的操作门槛,对有经验者形同虚设。