# 进入和退出浏览器全屏模式
大多数浏览器都已实现了网页的全屏功能,并提供了快捷键,通常是 F11 和 Esc 键。除了键盘快捷键,W3C 还为全屏定义了两个 API。通过这个 API,我们可以使用 JavaScript 控制网页的全屏显示。
# 全屏 API
W3C 标准中的方法:
进入全屏:Element.requestFullscreen (opens new window)
退出全屏: Document.exitFullscreen (opens new window)
当前全屏模式的元素:Document.fullscreenElement (opens new window)
然而,在部分版本的浏览器中需要使用的方法却有所不同,参考下表:
功能 | webkit | Gecko(Firefox) | IE11 |
---|---|---|---|
进入全屏 | webkitRequestFullScreen | mozRequestFullScreen | msRequestFullScreen |
退出全屏 | webkitExitFullscreen | mozCancelFullScreen | msExitFullscreen |
当前全屏模式的元素 | webkitFullscreenElement or (webkitCurrentFullScreenElement, mobile safari) | mozFullScreenElement | msFullscreenElement |
尽管 W3C 制定了全屏 API 的标准,但是在各种浏览器中的支持程度并不好。因此,在使用时有必要进行兼容性处理。
# 兼容性封装
进入全屏
function requestFullscreen() { const html = document.documentElement; const rfs = html.requestFullscreen || html.mozRequestFullScreen || html.webkitRequestFullScreen || html.msRequestFullscreen; return rfs.call(html); }
退出全屏
function exitFullscreen() { const efs = document.exitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen || document.msExitFullscreen; return efs.call(document); }
获取当前全屏的元素
function getFullscreenElement() { return document.fullscreenElement || document.webkitFullscreenElement || document.webkitCurrentFullScreenElement || document.mozFullScreenElement || document.msFullscreenElement; }
# 判断是否全屏
由于 Document.fullscreen
(opens new window) 属性已被废弃,根据 MDN 文档,我们可以通过检查 Document.fullscreenElement
是否等于 null
来判断是否处于全屏模式。
funcion isFullscreen() {
return getFullscreenElement() !== null;
}
然而,从 can i use (opens new window) 上来看,尽管可以使用不同的前缀获取 fullscreenElement
,但其兼容性表现仍然不够理想。在对兼容性要求较高的场景中,可以使用 Screen API (opens new window) 作为辅助手段来判断是否处于全屏模式。
function isFullscreen() () {
const fullscreenElement = getFullscreenElement();
if(fullscreenElement === undefined) {
return window.innerWidth === screen.availWidth && window.innerHeight === screen.availHeight;
}
return fullscreenElement !== null;
}
# 事件监听
在进入和退出全屏后, 浏览器会触发 fullscreenchange
(opens new window) 事件, 相关的非标准事件还有:
webkitfullscreenchange
mozfullscreenchange
MSFullscreenChange
根据 can I use (opens new window) 上提供的信息, fullscreenchange
事件的兼容性并不是很好。为了提高在各种浏览器和设备上的兼容性,Foxit PDF SDK for Web 提供了 UIEvents.fullscreenchange
(opens new window) 事件。
以下示例将使用 PDFUI 库提供的 addUIEventListener
函数来监听 fullscreenchange
事件:
pdfui.addUIEventListener(UIExtension.UIEvents.fullscreenchange, isFullscreen => {
// do something here
})
请注意,在使用 UIEvents.fullscreenchange
事件之前,需要确保在 PDFUI 初始化时加载了full-screen
addon,或者使用了 AllInOne.js 或 AllInOne.mobile.js。有关更多详细信息,请参阅 Addon 简介 章节.
或者,您可以选择不使用提供的事件,而是使用 resize
事件来监听,也可以实现与 fullscreenchange
相同的效果。具体方法如下:
let _isFullscreen = isFullscreen(); // 参考 "判断是否全屏" 小节
window.addEventListener('resize', () => {
const currentIsFullscreen = isFullscreen();
if(currentIsFullscreen !== _isFullscreen) {
// 到这里表示发生了进入全屏或者退出全屏的变化,也就是对应了 fullscreenchange
}
_isFullscreen = currentIsFullscreen;
})
这两种方法都允许您在浏览器的全屏模式更改时执行某些操作。选择适合您需求和浏览器兼容性要求的方法。