esc退出全屏是浏览器强制行为,无法禁用;若无响应,需检查document.fullscreenelement是否为非null,确认真正进入全屏,且避免在iframe或异步回调中调用exitfullscreen()。

HTML5全屏API触发后按ESC不退出?先确认是否调用了exitFullscreen()
ESC退出全屏是浏览器默认行为,无法被“禁用”,但如果你发现按ESC没反应,大概率是当前文档没处于真正的全屏状态——比如requestFullscreen()被拒绝、执行失败,或你全屏的是某个子元素(如<video></video>),而ESC只响应顶层document的全屏态。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 调用
requestFullscreen()后,务必检查document.fullscreenElement是否为非null,而不是只看Promise是否resolve(部分浏览器会resolve但未真正进入) - 若用
video.requestFullscreen(),ESC仍能退出,但退出后document.fullscreenElement可能为null,而video自身状态需监听fullscreenchange事件判断 - 避免在iframe中调用全屏(除非设置
allow="fullscreen"),否则requestFullscreen()直接静默失败
想拦截ESC退出?做不到,但可以监听并补救
浏览器不允许阻止ESC退出全屏,这是强制安全策略。你不能event.preventDefault()在keydown里拦ESC来“锁住”全屏——它压根不会触发该事件。唯一可监听的是退出动作本身。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 监听
document上的fullscreenchange事件,而非keydown:退出发生时,document.fullscreenElement会变为null,此时可立刻调用requestFullscreen()尝试重进(但用户可能反感,且第二次调用需用户手势触发) - 不要依赖
fullscreenerror事件来“兜底”,它只在请求失败时触发,和ESC退出无关 - 移动端(尤其是iOS Safari)不支持
requestFullscreen()对普通<div>生效,仅<code><video></video>等媒体元素可用,这点常被忽略document.exitFullscreen()报错“NotAllowedError”?检查调用上下文这个错误不是因为权限问题,而是因为调用时机不对:必须由用户手势(如click、touchend)触发,且不能跨异步任务链丢失上下文。常见于setTimeout、Promise.then、fetch回调里调用。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 把
exitFullscreen()直接写在click handler里,不要包在setTimeout(() => { exitFullscreen() }, 0)中 - 如果需要延迟退出(比如动画结束后),改用
element.addEventListener('animationend', () => document.exitFullscreen()),确保事件由用户交互间接发起 - 注意Safari对
exitFullscreen()的兼容性:旧版需用webkitExitFullscreen(),但现代版本已统一支持标准方法
自定义ESC退出后的逻辑:别试图阻止,专注状态同步
真正可控的点只有一个:用户按ESC退出后,你得立刻知道,并让UI/业务逻辑跟上。难点在于
fullscreenchange事件可能触发多次(进入、退出各一次),且不同浏览器触发顺序略有差异。实操建议:
立即学习“前端免费学习笔记(深入)”;
- 用一个布尔值
isFullscreen变量配合事件更新,不要仅靠document.fullscreenElement实时读取——它在事件回调中可能还没更新完毕 - 在
fullscreenchange回调开头加if (!document.fullscreenElement) { /* 退出逻辑 */ },比用else更可靠 - 如果页面有多个可全屏区域(如多个
<canvas></canvas>),退出后要重置所有相关状态,否则下次调用可能因残留标记失败
最易被忽略的是:全屏状态不跨tab同步,也不持久化。用户刷新页面后一切归零,别指望靠
localStorage自动恢复——全屏必须由用户主动触发,脚本无权代劳。 - 把











