controlslist="nodownload" 不起作用的常见原因:仅 chrome 70+/edge 79+ 支持,firefox/safari 完全忽略;必须与 controls 同时存在才生效;值须小写、无连字符、无引号内空格;无法禁用右键“另存为”;不阻止 network 面板获取视频地址。

controlslist="nodownload" 不起作用的常见原因
直接写 controlslist="nodownload" 但下载按钮依然存在,大概率是因为浏览器兼容性或属性值拼写错误。这个属性只在 Chrome 70+ 和 Edge 79+ 支持,Firefox 和 Safari 完全不支持;且必须和 controls 属性同时存在才生效——没有 controls,controlslist 会被忽略。
-
controlslist是布尔型属性,但值必须是字符串,不能写成controlslist=nodownload(缺引号)或controlslist="no-download"(连字符错) - 如果视频是通过
src直接加载的 MP4 文件,浏览器仍可能在右键菜单中提供“另存为”,controlslist对右键无效 - 某些 Chrome 版本(如 115–118)对
controlslist的解析有临时 bug,需搭配crossorigin或服务端响应头Content-Disposition: inline才稳定隐藏
真正能屏蔽下载的组合写法
仅靠 HTML 属性无法 100% 阻止下载,但以下组合可最大限度抑制 UI 层下载入口:
- 必须同时声明
controls和controlslist:<video controls controlslist="nodownload nofullscreen noremoteplayback"></video>
- 禁用右键菜单(基础防护):
oncontextmenu="return false" - 服务端配合:响应头设置
Content-Disposition: inline,避免浏览器自动触发下载逻辑 - 更进一步可移除
src,改用<source></source>+ JavaScript 动态设置src,延迟暴露真实 URL
为什么不能完全禁止用户下载视频
只要视频资源能被浏览器解码播放,就必然经过内存或磁盘缓存。用户可通过开发者工具的 Network 面板找 .mp4、.m3u8 或 media 类型请求,或使用扩展如 “Video DownloadHelper”。controlslist="nodownload" 只是隐藏控件,并不改变资源可访问性。
- DRM(如 Widevine)才能真正限制复制,但需要打包加密、许可证服务器和专用播放器(如
dash.js或shaka-player) - 前端 JS 拦截
fetch或XMLHttpRequest对 media 请求无效——浏览器媒体栈绕过 JS 网络层 - 所谓“防盗链”(
Referer校验)只能防外站盗链,对同源页面无效
替代方案:用 poster + 播放时替换 src
如果目标只是“不让用户一眼点下载”,可以初始不设 src,用 poster 模拟封面,点击后才注入真实地址——这样 Network 面板里不会提前暴露 URL,也能规避部分自动化抓取工具。
<video id="myVideo" controls controlslist="nodownload" poster="/cover.jpg"></video>
然后用 JS:
document.getElementById('myVideo').onclick = function() {<br> if (!this.src) {<br> this.src = '/real-video.mp4';<br> this.load();<br> this.play();<br> }<br>};
注意:这不能防技术用户,但能提高普通用户的下载门槛。真实流媒体场景建议直接上 HLS/DASH + token 鉴权,而不是依赖 controlslist。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











