requestfullscreen() 无反应大概率是触发条件未满足:必须在真实 click 回调中调用,目标元素需已挂载且可见,不能对 body/html 调用,iframe 需加 allow="fullscreen" 属性。

按钮点击后 requestFullscreen() 无反应,怎么排查
大概率不是代码写错了,而是触发条件没满足。浏览器会静默失败——不报错、不进全屏、document.fullscreenElement 始终为 null。
- 检查是否在真实
click回调里调用:不能包在setTimeout、fetch().then或组件mounted钩子的异步回调中 - 确认目标元素已挂载且可见:
el.offsetParent !== null,不能是display: none或visibility: hidden - 别对
document.body或document.documentElement调用——Safari 直接拒绝,应选具体容器,如<div id="app"> <li>若页面嵌在 <code><iframe></iframe>中,必须加allow="fullscreen"属性,否则静默失败 - 监听必须写成:
document.addEventListener('fullscreenchange', handler),绑在目标元素上收不到事件 -
document.fullscreenElement是唯一可信标识:等于你的目标元素表示已全屏;为null表示未全屏(注意不是undefined) - Safari 触发
fullscreenchange有微小延迟,读取状态前建议加Promise.resolve().then(() => {...}) - 按钮文案切换逻辑应基于此判断,例如:
if (document.fullscreenElement === container) { button.textContent = '退出全屏'; } - 不要提前判空再调用——
if (document.fullscreenElement) document.exitFullscreen()多余且不可靠(Safari 状态滞后) - 统一用
document.exitFullscreen().catch(() => {})捕获错误,避免未处理 promise rejection - 切勿写成
container.exitFullscreen()—— 这个方法根本不存在,只存在document.exitFullscreen() - 退出后 UI 状态脱节常见于只依赖 Esc 键退出,而没监听
fullscreenchange更新按钮文案 -
<iframe src="..." allow="fullscreen"></iframe>缺一不可,allowfullscreen(旧写法)已过时,必须用allow="fullscreen" - 移动端
<video></video>全屏还需确保没设playsinline,否则无法触发原生全屏控件 - 别用 CSS 模拟全屏(如
width: 100vw; height: 100vh),它绕过安全策略,后续requestFullscreen()会被浏览器静默拒绝
如何正确监听和响应全屏状态变化
fullscreenchange 只在 document 上有效,且不带目标信息,必须靠 document.fullscreenElement 判断当前状态。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
退出全屏时 document.exitFullscreen() 报错怎么办
document.exitFullscreen() 在非全屏状态下执行,现代浏览器不会中断脚本,但老版 Edge 可能抛 NotFoundError,控制台会被污染。
移动端和 iframe 场景下容易被忽略的限制
iOS Safari 对全屏支持极严:仅允许 <video></video> 等少数元素真正覆盖系统 UI,普通 <div> 全屏在 iOS 上基本无效;iframe 则完全依赖属性授权。
<ul>
<li>iOS 15+ 才开放部分非 <code><video></video> 元素全屏能力,但实际仍受限于系统策略,不要默认它能工作
document.fullscreenElement 都没变——这时候先看控制台有没有 NotAllowedError,再顺着手势、DOM 可见性、iframe 权限这三步查,比重写逻辑快得多。










