原生JS监听浏览器F11全屏按键方法

本文介绍了如何使用原生JavaScript实现监听浏览器的F11按键,以实现全屏模式的切换功能。内容包括解决监听叠加问题的优化代码,适合前端开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原生JS监听浏览器F11全屏按键方法

自己工作中遇到的一点点小问题,记录一下,希望也能对你们有帮助。
网上找的资料发现,监听会叠加,就做了小小的优化。代码如下:

<script>
    $(function () {
        console.log(123123);
        $(document).on("keydown", function (e) {
            var e = event || window.event || arguments.callee.caller.arguments[0];
            if (e && e.keyCode == 122) {
                //捕捉F11键盘动作
                e.preventDefault(); //阻止F11默认动作
                var el = document.documentElement;
                var rfs =
                    el.requestFullScreen ||
                    el.webkitRequestFullScreen ||
                    el.mozRequestFullScreen ||
                    el.msRequestFullScreen; //定义不同浏览器的全屏API //执行全屏
                if (typeof rfs != "undefined" && rfs) {
                    rfs.call(el);
                } else if (typeof window.ActiveXObject != "undefined") {
### 解决方案概述 JavaScript 全屏 API 和 F11 按键之间的冲突主要源于浏览器的安全机制以及两者在全屏控制上的差异。以下是针对该问题的具体分析和解决方案。 --- #### 1. **原因解析** 浏览器为了保护用户的隐私和体验,限制了 JavaScript 对 F11 全屏模式的操作权限[^1]。具体来说: - 当用户通过 F11 或 Command+Ctrl+F 进入全屏时,这是由浏览器直接处理的行为,而非 JavaScript 控制。 - 使用 FullScreen API 请求的全屏是由脚本发起的,因此可以被脚本管理(如检测状态、退出等)。 - 浏览器不允许 JavaScript 干预用户手动触发的全屏行为,这属于安全性设计的一部分。 这种分离的设计意味着,如果页面希望完全掌控全屏逻辑,则需要阻止 F11 默认行为并替换为自定义的全屏实现。 --- #### 2. **技术实现** 以下是一个完整的解决方案,基于 `screenfull` 库或原生 FullScreen API 实现对 F11 行为的拦截,并提供一致的全屏体验。 ##### (1)**阻止 F11 默认行为** 通过监听键盘事件捕获 F11 键按下动作,并调用自定义的全屏切换函数。 ```javascript document.addEventListener('keydown', (event) => { if (event.key === 'F11') { event.preventDefault(); // 阻止浏览器默认的 F11 全屏行为 toggleFullScreen(); // 调用自定义全屏切换方法 } }); ``` ##### (2)**封装全屏切换逻辑** 利用 `screenfull.js` 或者原生 FullScreen API 来实现全屏切换功能。 ```javascript function toggleFullScreen() { if (screenfull.isEnabled) { // 检查是否支持全屏 if (screenfull.isFullscreen) { screenfull.exit().then(() => console.log('已退出全屏')).catch((err) => console.error(err)); } else { screenfull.request(document.documentElement).then(() => console.log('已进入全屏')).catch((err) => console.error(err)); } } else { console.warn('当前环境不支持全屏'); } } ``` ##### (3)**监听全屏状态变化** 无论通过 ESC 键还是其他方式退出全屏,都需要更新应用的状态变量以保持同步。 ```javascript let isFullScreen = false; screenfull.on('change', () => { isFullScreen = !!screenfull.isFullscreen; console.log(`当前全屏状态: ${isFullScreen}`); }); // 卸载事件监听器以防内存泄漏 window.addEventListener('beforeunload', () => { document.removeEventListener('keydown', handleKeyDownEvent); screenfull.off('change', handleFullscreenEvent); }); ``` --- #### 3. **Vue 中的应用实例** 对于 Vue 项目,可以在全局组件(如 App.vue)中集成上述逻辑。 ```vue <template> <div id="app"> <!-- 主体内容 --> </div> </template> <script> import screenfull from 'screenfull'; export default { data() { return { isFullScreen: false, }; }, mounted() { this.initFullScreen(); }, beforeDestroy() { this.destroyFullScreenListeners(); }, methods: { initFullScreen() { const handleKeyDownEvent = (event) => { if (event.key === 'F11') { event.preventDefault(); this.toggleFullScreen(); } }; const handleFullscreenChange = () => { this.isFullScreen = !!screenfull.isFullscreen; }; document.addEventListener('keydown', handleKeyDownEvent); screenfull.on('change', handleFullscreenChange); this.$once('hook:beforeDestroy', () => { document.removeEventListener('keydown', handleKeyDownEvent); screenfull.off('change', handleFullscreenChange); }); }, toggleFullScreen() { if (screenfull.isEnabled) { if (this.isFullScreen) { screenfull.exit().then(() => {}).catch((err) => {}); } else { screenfull.request().then(() => {}).catch((err) => {}); } } }, }, }; </script> ``` --- #### 4. **注意事项** - 上述代码依赖第三方库 `screenful.js` 提供跨浏览器兼容性支持。如果不使用此库,需自行适配不同浏览器的前缀化属性(如 `-webkitRequestFullScreen` 等)。[^2] - 如果目标设备可能禁用了 JavaScript,则仍允许用户通过 F11 手动操作全屏。 - 在某些特殊场景下(如嵌套 iframe),全屏 API 可能受限,需额外验证宿主页面的支持情况。 --- ### 结论 通过以上方法可有效解决 JavaScript 全屏 API 与 F11 按键间的冲突问题,同时确保用户体验的一致性和可控性。最终效果取决于实际业务需求和技术选型。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值