我在开发大屏项目时遇到一个特殊需求:需要在不同显示器上展示不同页面。经过探索,我发现浏览器原生支持的Window Management api完美解决了这个问题。这个API能直接访问用户显示器配置,实现真正的多屏控制。
重要提示:该API仅在HTTPS环境或localhost下可用,这是浏览器的安全限制
import { ElMessage } from 'element-plus'
// 状态存储
let permissionStatus = null
let screenDetails = null
let currentPopup = null
let popupObserver = null
// 初始化屏幕管理
window.addEventListener('load', async () => {
// 检查浏览器支持
if (!('getScreenDetails' in window) ||
!('onchange' in screen)) {
ElMessage.error('您的浏览器不支持多屏管理功能')
return
}
// 注册屏幕变化监听
screen.addEventListener('change', updateScreens)
window.addEventListener('resize', updateScreens)
// 检查并请求权限
try {
permissionStatus = await navigator.permissions.query({
name: 'window-management'
})
// 监听权限变化
permissionStatus.onchange = () => {
updateScreens(false)
}
} catch (error) {
console.error('权限请求失败:', error)
}
await updateScreens()
})
// 更新屏幕信息
const updateScreens = async (requestPermission = true) => {
try {
const screens = await getScreenDetails(requestPermission)
const currentScreen = await getCurrentScreen()
return { screens, currentScreen }
} catch (error) {
console.error('屏幕更新失败:', error)
return { screens: [window.screen], currentScreen: window.screen }
}
}
// 获取屏幕详情
const getScreenDetails = async (requestPermission) => {
// 权限检查
if (permissionStatus?.state === 'denied') {
ElMessage.error('请允许窗口管理权限')
return [window.screen]
}
try {
// 获取屏幕详情
screenDetails = await window.getScreenDetails()
// 设置屏幕变化监听
screenDetails.addEventListener('screenchange', () => {
updateScreens(false)
})
return screenDetails.screens
} catch (error) {
// HTTPS环境检查
if (!location.hostname.includes('localhost') &&
location.protocol !== 'https:') {
ElMessage.warning('该功能需在HTTPS环境或localhost下使用')
}
return [window.screen]
}
}
// 获取当前屏幕
const getCurrentScreen = async () => {
try {
if (!screenDetails) return window.screen
return screenDetails.currentScreen
} catch {
return window.screen
}
}
// 在指定屏幕打开窗口
const openPopup = async (screenIndex) => {
const screens = await getScreenDetails(true)
if (!screens[screenIndex]) {
ElMessage.error('指定屏幕不存在')
return
}
const targetScreen = screens[screenIndex]
const options = {
url: window.location.href,
x: targetScreen.availLeft,
y: targetScreen.availTop,
width: targetScreen.availWidth,
height: targetScreen.availHeight
}
// 关闭已有弹窗
if (currentPopup) currentPopup.close()
// 打开新窗口
currentPopup = window.open(
options.url,
'_blank',
`left=${options.x},top=${options.y},
width=${options.width},height=${options.height}`
)
// 监控窗口状态
if (popupObserver) clearInterval(popupObserver)
popupObserver = setInterval(() => {
if (currentPopup.closed) {
clearInterval(popupObserver)
currentPopup = null
}
}, 500)
}
export { updateScreens, openPopup }
<template>
<div class="screen-manager">
<h3>检测到的屏幕 ({{ screens.length }})</h3>
<div class="screen-list">
<div
v-for="(scr, index) in screens"
:key="index"
class="screen-item"
@click="openScreen(index)">
<span>屏幕 #{{ index + 1}}</span>
<span>{{ scr.width }} × {{ scr.height }}</span>
</div>
</div>
<button @click="refreshScreens">刷新屏幕信息</button>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { openPopup, updateScreens } from './screenAPI.js'
const screens = ref([])
// 初始化屏幕信息
const refreshScreens = async () => {
const result = await updateScreens()
screens.value = result.screens
}
// 在指定屏幕打开窗口
const openScreen = (index) => {
openPopup(index)
}
// 初始加载
refreshScreens()
</script>
// 窗口间通信示例
const broadcast = new BroadcastChannel('screen_channel')
// 发送消息
broadcast.postMessage({ type: 'data_update', payload: newData })
// 接收消息
broadcast.onmessage = (event) => {
console.log('收到消息:', event.data)
}
权限被拒绝:
API不可用:
// 功能检测
const isSupported = () => {
return 'getScreenDetails' in window &&
'permissions' in navigator
}
窗口定位偏移:
Window Management API为浏览器多屏应用开发提供了强大支持。通过本文介绍的方法,你可以:
虽然该API目前兼容性有限(主要支持Chromium内核浏览器),但随着多屏办公需求增长,其应用前景十分广阔。建议在需要多屏展示的数据可视化、数字看板等项目中尝试使用。
您的浏览器禁用了JS脚本运行,请启用该功能。怎么解除浏览器禁用js?这篇文章将总结整理各个浏览器如何开启、禁用javascript的方法总汇。
浏览器使用流式布局模型 (Flow Based Layout)。浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了Render Tree。有了RenderTree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上。
IE6不支持min-height,解决办法使用css hack,ol内li的序号全为1,不递增。解决方法:为li设置样式display: list-item;定位父元素overflow: auto;,包含position: relative;子元素,子元素高于父元素时会溢出。解决办法:
由于不同的浏览器默认的样式也不同,所以在网页开发前设置一个公用样式,来清除各个浏览器的默认样式,已达到做的网页在各个浏览器中达到统一。
浏览器访问网站的步骤:Chrome搜索自身的DNS缓存、读取本地HOST文件、浏览器发起一个DNS的一个系统调用、浏览器获得域名对应的IP地址后,发起HTTP三次握手、TCP/IP连接建立起来、服务器端接受到了这个请求、浏览器根据拿到的资源对页面进行渲染
Browsh是一个纯文本浏览器,可以运行在大多数的TTY终端环境和任何浏览器。目前,终端客户端比浏览器客户端更先进。终端客户端即时更新和交付,以便于体验新的功能,例如,你可以观看视频。
一般说的浏览器内核是指浏览器最重要的核心部分,RenderingEngine,翻译成中文大概意思就是“解释引擎”,我们一般称为浏览器内核。由于不同的内核各自有一套自己的渲染网页和解释页面代码的机制,所以就会有一些问题存在。
主流浏览器之争从上个世纪开就开始,已经持续了很长的时间。人们都在笑话IE,纷纷转向其它浏览器。今天,我向大家分享一下针对IE的搞笑图片,只是逗乐而已,喝杯咖啡,坐下来慢慢享受吧。
有时候我们希望在浏览器中执行一些低优先级的任务,比如记录统计数据、做一些耗时的数据处理等,暂且将其称为后台任务。这些任务跟动画计算、合成帧、响应用户输入等高优先级的任务共享主线程
浏览器的事件循环,前端再熟悉不过了,每天都会接触的东西。但我以前一直都是死记硬背:事件任务队列分为macrotask和microtask,浏览器先从macrotask取出一个任务执行,再执行microtask内的所有任务,接着又去macrotask取出一个任务执行
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!