禁用投屏需在html的标签中直接添加disableremoteplayback布尔属性和controlslist="noremoteplayback",二者必须作为原生属性写死,不可用js动态设置或赋字符串值,且需注意各浏览器及webview兼容性差异。

直接改 <video></video> 标签,不是改 JS 或后端
防投屏的配置只在 HTML 的 <video></video> 元素上生效,和 JavaScript 动态设置、服务端模板渲染逻辑都无关。你必须找到页面中实际渲染出 <video></video> 标签的源文件(可能是 .html、.ejs、.vue 单文件组件的 template 部分,或 CMS 输出的静态 HTML 片段),定位到对应标签位置修改。
常见错误是去改 video.play() 或监听 webkitbeginfullscreen 的 JS 代码——这些对禁用投屏无效,disableRemotePlayback 和 controlslist 必须作为原生 HTML 属性写死在标签上,浏览器才识别。
disableRemotePlayback 要写成布尔属性,不能带等号
这个属性只有“存在”和“不存在”两种状态,浏览器不认字符串值。写成 disableRemotePlayback="true" 或 disableRemotePlayback="disabled" 会被完全忽略,和没写一样。
- ✅ 正确:
<video controls disableremoteplayback></video> - ❌ 错误:
<video controls disableremoteplayback="true"></video> - ❌ 错误:
<video controls disableremoteplayback="false"></video>(false 也无效,存在即启用提示)
它只是向浏览器发信号,Chrome/Edge 会隐藏地址栏投屏图标、禁用右键菜单里的“投射到设备”,但 Safari(iOS 15.4+)仅对 AirPlay 有部分响应,Firefox 完全无视。
配合 controlslist="noremoteplayback" 更稳妥
controlslist 是更宽泛的控制条干预属性,noremoteplayback 参数和 disableRemotePlayback 作用重叠,但部分 Android WebView 或旧版 Chrome 对前者兼容性稍好。两者可以同时使用,无冲突:
<video controls disableremoteplayback controlslist="noremoteplayback"><source src="video.mp4" type="video/mp4"></source></video>
注意:controlslist 也必须是空格分隔的纯关键字,不能写成 controlslist="noremoteplayback=true";它还支持 nodownload、nofullscreen 等,但每个参数只起提示作用,无法强制阻止系统级录屏或物理拍摄。
别漏掉移动端 WebView 和小程序的实际表现
你在桌面 Chrome 里看到投屏按钮消失了,不代表用户在微信小程序或 App 内嵌 WebView 里也生效。Android WebView(尤其低版本)常忽略 disableRemotePlayback;微信内置浏览器对 controlslist 支持极差,基本无效。
如果业务强依赖防投屏,光靠 HTML 属性远远不够。真正要拦住的是视频 URL 泄露——得靠服务端做 Token 鉴权、Referer 校验、单次有效签名,再配合前端动态替换 src,否则用户打开 DevTools 的 Network 面板,照样能拿到直链并投屏播放。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











