controlslist="nodownload"无效的主因是浏览器兼容性差或写法错误:仅Chrome 70+/Edge 79+/Opera支持,Firefox完全忽略,Safari支持极弱;必须与controls共存,且值须小写、无连字符、无引号内空格;它仅隐藏UI下载按钮,无法阻止右键另存为或Network面板获取地址。

controlslist="nodownload" 为什么没用
直接加 controlslist="nodownload" 却仍有下载按钮,大概率是浏览器不支持或写法错误。这个属性只在 Chrome 70+、Edge 79+、Opera 中稳定生效;Firefox 完全忽略,Safari 对 nodownload 支持极弱。它还必须和 controls 同时存在——没开原生控件,controlslist 就被浏览器直接跳过。
常见写错形式包括:controlslist=nodownload(缺引号)、controlslist="no-download"(连字符错)、controlslist="nodownload "(末尾空格)。值必须小写、无空格、无引号内多余字符。
即使写对了,也仅隐藏控件栏里的下载图标,不影响右键菜单中的「视频另存为」,更无法阻止 Network 面板里找 .mp4 或 .m3u8 请求。
oncontextmenu="return false" 能拦住右键下载吗
不能彻底拦截。给 <video> 加 oncontextmenu="return false" 只能屏蔽页面级右键菜单,但 Chrome、Edge 等浏览器的原生视频上下文菜单(含「另存为视频」)由 UA 样式控制,JS 无法覆盖。
立即学习“前端免费学习笔记(深入)”;
更关键的是:用户打开 DevTools → Network → Filter media → 找到请求 → 右键 Copy link address → 新标签页打开,照样能下载。这个路径完全绕过所有前端事件绑定。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
所以 oncontextmenu 最多防住小白用户误点,对懂技术的人毫无约束力。不要把它当成防护手段,只当 UI 层礼貌提示。
真正起效的组合写法有哪些
要让下载入口在 UI 层尽可能“不可见”,需多层配合:
-
<video controls controlslist="nodownload noremoteplayback">—— 基础控件层隐藏 -
oncontextmenu="return false"—— 补一层右键拦截(虽不完美但有心理暗示) - 服务端响应头加
Content-Disposition: inline—— 防止浏览器把视频 URL 当作附件自动触发下载逻辑 - 视频 URL 带时效 Token,如
video.mp4?token=xxx&expires=1722767320—— 复制链接后过期即失效,这是唯一能实际提高门槛的前端可配方案
注意:disableRemotePlayback 是独立布尔属性,比 controlslist="noremoteplayback" 更可靠,建议优先用前者。
为什么 CSS 伪元素隐藏下载按钮不推荐
像 video::-internal-media-controls-download-button { display: none } 这类写法看似直接,但问题很多:
一是仅 WebKit 内核有效(Chrome/Safari),Firefox 和新版 Edge 已逐步弃用该伪类;二是它靠“把按钮移出视窗”实现隐藏,容易被用户通过 DevTools 临时禁用样式还原;三是部分 Chrome 版本(如 115–118)会因布局计算异常导致控件栏错位甚至功能失灵。
这类 CSS 方案属于“临时补丁”,稳定性差、维护成本高,且同样不解决 Network 面板暴露 URL 的根本问题。真要控制访问,得从服务端 Token 或流媒体分片入手。


















