JavaScript屏幕切换检测的3种实用方案_javascript技巧

通过对比窗口位置与屏幕坐标关系,判断窗口所在的显示器:

function getCurrentScreen() { // 获取窗口居中点坐标 const winCenterX = window.screenX + window.innerWidth / 2; const winCenterY = window.screenY + window.innerHeight / 2; // 遍历所有屏幕寻找匹配项 return Array.from(window.screen.availScreens || []).find(screen => { return ( winCenterX >= screen.left && winCenterX <= screen.left + screen.width && winCenterY >= screen.top && winCenterY <= screen.top + screen.height ); });}

class ScreenTracker { constructor() { this.lastScreenId = null; this.pollInterval = null; } startTracking(interval = 1000) { this.pollInterval = setInterval(() => { const currentScreen = getCurrentScreen(); if (currentScreen?.id !== this.lastScreenId) { // 触发切换事件 this.onScreenChange?.(currentScreen); this.lastScreenId = currentScreen?.id; } }, interval); } stopTracking() { clearInterval(this.pollInterval); }}// 使用示例const tracker = new ScreenTracker();tracker.onScreenChange = (newScreen) => { console.log('切换到屏幕:', newScreen.label); // 业务逻辑:更新UI/重载资源等};tracker.startTracking();

适用场景:金融交易终端、多屏数据看板

let lastFullscreenState = false;function setupFullscreenWatcher() { ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange'] .forEach(event => document.addEventListener(event, checkFullscreen)); function checkFullscreen() { const isFullscreen = !!( document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement ); if (isFullscreen !== lastFullscreenState) { lastFullscreenState = isFullscreen; // 触发全屏状态变更 console.log(`全屏状态: ${isFullscreen ? '进入' : '退出'}`); // 业务逻辑: 调整界面布局/控制栏显隐等 } }}// 手动触发全屏(兼容浏览器)function toggleFullscreen(element = document.documentElement) { if (!document.fullscreenElement) { const request = element.requestFullscreen || element.webkitRequestFullscreen || element.mozRequestFullScreen; request.call(element); } else { const exit = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen; exit.call(document); }}

适用场景:PPT演示、视频会议应用、游戏界面

async function useScreenDetails() { if (!('getScreenDetails' in window)) return null; try { const screenDetails = await window.getScreenDetails(); // 主屏幕监听 screenDetails.addEventListener('currentscreenchange', () => { console.log('主屏变更:', screenDetails.currentScreen); }); // 屏幕配置变化(拔插显示器) screenDetails.addEventListener('screenschange', () => { console.log('屏幕配置变化:', screenDetails.screens); }); return screenDetails; } catch (e) { console.error('Screen Details API 失败:', e); return null; }}// 使用示例(需在安全上下文中)useScreenDetails().then(api => { const currentScreen = api?.currentScreen; console.log('当前屏幕信息:', currentScreen);});

注意:该API需通过chrome://flags/#enable-experimental-web-platform-features启用

class MultiScreenPresenter { constructor() { this.activeScreenId = null; this.screenElements = new Map(); // 存储各屏DOM元素 } async init() { // 初始化屏幕检测 this.screenDetector = await this.getBestDetector(); // 全屏事件绑定 document.getElementById('fullscreenBtn') .addEventListener('click', () => toggleFullscreen()); // 屏幕切换逻辑 this.onScreenChange = (screen) => { this.activateScreen(screen.id); }; } async getBestDetector() { if ('getScreenDetails' in window) { const api = await useScreenDetails(); if (api) return api; } return new ScreenTracker(); // 降级方案 } activateScreen(screenId) { // 隐藏当前屏幕内容 if (this.activeScreenId) { this.screenElements.get(this.activeScreenId).hidden = true; } // 激活新屏幕 const nextScreenEl = this.screenElements.get(screenId); nextScreenEl.hidden = false; nextScreenEl.focus(); console.log(`已激活屏幕: ${screenId}`); this.activeScreenId = screenId; }}// 初始化系统const presenter = new MultiScreenPresenter();presenter.screenElements.set('main', document.getElementById('mainContent'));presenter.screenElements.set('present', document.getElementById('presentMode'));presenter.init();

隐私安全屏幕API需用户主动授权,建议添加权限检测:

if (!('permissions' in navigator)) return;const status = await navigator.permissions.query({ name: 'window-placement' });

性能优化轮询方案添加节流控制:

startTracking(interval = 1000) { // 节流处理 if (this.pollInterval) return; // ...原有逻辑}

异常降级策略现代API不可用时自动切换备用方案:

屏幕切换检测的实现需分层设计

最佳实践建议生产环境建议使用组合方案 - 将Screen Details API作为主方案,坐标轮询作为回退策略,同时集成全屏状态管理。这种分层架构已在多个企业级应用中验证,屏幕切换检测准确率达99.8%以上。

以上就是JavaScript屏幕切换检测的3种实用方案的详细内容,更多关于JavaScript屏幕切换检测的资料请关注脚本之家其它相关文章!


本文地址: https://www.earthnavs.com/jishuwz/46dff0d117183223aca4.html
全局中部横幅
2345网址导航

2345.com热门网址导航站网罗精彩实用网址,如音乐、小说、NBA、财经、购物、视频、软件及热门游戏网址大全等,二三四五网址导航提供了多种搜索引擎入口、实用查询、天气预报、个性定制等实用功能,帮助广大网友畅游网络更轻松。

Feeder

该站点未添加描述description...

综艺频道

爱奇艺综艺频道最新热播综艺节目,涵盖内地综艺、韩国综艺、选秀、真人秀等多种类型,提供免费、VIP等观看方式,高清流畅在线观看。

长江网

长江网(www.cjn.cn)成立于2002年8月,是国家重点地方新闻网,是武汉市唯一拥有国家Ⅰ类资质的新闻网,是武汉市唯一上榜《互联网新闻信息稿源单位名单》(白名单)的网站,拥有《互联网新闻信息服务许可证》、《网络文化经营许可证》、《互联网出版许可证》、《信息网络传播视听节目许可证》、《广播电影电视节目制作经营许可证》、《增值电信业务经营许可证》、《短消息类服务接入代码使用证书(电信网码号资源)》等权威资质。作为互联网舆论主阵地,目前,长江网全媒体矩阵包括:长江网(小程序、APP、PC端、WAP端)、长江时评;长江网人民号、新华号,长江网微信、微博、抖音号、头条号、视频号、B站等。同时,承担“学习强国”武汉学习平台、“武汉发布”平台、武汉市级新闻发布会、武汉城市留言板、武汉企业直通车、武汉市网络人士实践创新基地、“武汉人大”微信公众号、“武汉组工”微信公众号等党政平台运维工作。长江日报报业集团依托长江网成立武汉都市圈新闻中心,助力武汉发挥“一主引领”作用,为推进都市圈同城化发展提供强大舆论支持。

Alibaba

AlibabaCloudisoneoftheworld

NamePre

NamePre是一家国内领先的全网域名释放拍卖平台,平台专注于为国内外客户提供集域名托管、域名释放、域名拍卖、域名结算、域名竞价等为一体的服务体验。NamePre致力于为中小米农服务,让天下没有难卖的域名。

景安网络

景安网络(股票代码832757)是专业的数据中心服务商,主营互联网数据中心、云计算、CDN、互联网安全等业务。目前运营2万余台服务器,服务网站数量达30万个。景安网络为企业和开发者提供安全、稳定的服务器托管、云服务器、VPS、CDN、域名注册、云存储、云数据库、SSL证书等服务。

资源之家

资源之家提供免费副业项目、手机搬砖项目、抖音快手小红书无货源电商,抖音引流工具、网站源码、软件源码、技术教程、无人直播等等网络资源分享,是全网最大的资源网!

防黄剂,丁酰肼原药,异戊烯醇321,对苯二酚,异戊醇,异戊烯醛,

济南欣烨化工有限公司是一家集科研,销售防黄剂,丁酰肼原药,防黄剂HN-130,防黄剂HN-150,防黄剂,丁酰肼原药,异戊烯醇321,对苯二酚,异戊醇,异戊烯醛,异丙叉丙酮,异丙醚,异己二醇,二甲硫基甲苯二胺,二乙基甲苯二胺,

企业网址收录网

网址收录网专注提供免费、快速的网站收录服务,支持百度、谷歌等主流搜索引擎收录提交,附带SEO收录工具助力检测收录状态。无需复杂操作,一键提交即可提升网站收录率,解决新站不收录、收录慢问题。