Window Management API

Window Management API 允许获取连接到设备的显示器的详细信息,并将窗口放置在指定的屏幕上

检测是否多屏

Screen 接口的 isExtended 属性指示当前用户设备是否支持多屏

window-management 权限策略禁止时,始终返回 false

1
screen.isExtended

监测屏幕变化

Screen 接口的 change 事件在屏幕的参数变化时触发,返回一个 Event 事件,针对 width height availWidth availHeight colorDepth orientation 属性

ScreenDetailed 接口的 change 事件亦支持 left top availLeft availTop devicePixelRatio label isPrimary isInternal 属性

1
2
3
screen.addEventListener('change', (e) => {
//
})

获取屏幕信息

调用 Window 接口的 getScreenDetails() 方法获取用户端可用的所有

返回一个 Promise 的 ScreenDetails 实例

window-management 权限策略禁止或明确被用户拒绝授予 window-management 权限时,会抛出 NotAllowedError 异常

1
const screenDetails = await window.getScreenDetails()

ScreenDetails 接口反映了所有设备可用的屏幕的信息,该接口继承自 EventTarget 接口

ScreenDetails 接口的 currentScreen 属性返回一个 ScreenDetailed 实例,代表当前浏览器窗口所在的屏幕

ScreenDetails 接口的 screens 属性返回一个 ScreenDetailed 实例数组,代表当前设备可用的屏幕

1
2
const screens = screenDetails.screens
const current = screenDetails.currentScreen

ScreenDetails 接口的 currentscreenchange 事件在浏览器窗口移动至其他屏幕或当前屏幕的任意属性改变时触发,返回一个 Event 事件

ScreenDetails 接口的 screenschange 事件在当前设备可用的屏幕变化时触发,返回一个 Event 事件

1
2
3
4
5
6
screenDetails.addEventListener('currentscreenchange', () => {
current = screenDetails.currentScreen
})
screenDetails.addEventListener('screenschange', () => {
screens = screenDetails.screens
})

ScreenDetailed 接口反映了单个设备可用的屏幕的信息,该接口继承自 Screen 接口

ScreenDetailed 接口的 availLeft 属性返回一个 number,代表可用屏幕区域的 x 坐标

ScreenDetailed 接口的 availTop 属性返回一个 number,代表可用屏幕区域的 y 坐标

ScreenDetailed 接口的 devicePixelRatio 属性返回一个 number,代表屏幕的 device pixel ratio(当前屏幕时,等价于 window.devicePixelRatio

ScreenDetailed 接口的 isInternal 属性返回一个 boolean,指示是否为设备内部的屏幕

ScreenDetailed 接口的 isPrimary 属性返回一个 boolean,指示是否为操作系统的主屏幕

ScreenDetailed 接口的 label 属性返回一个 string,代表屏幕的描述性标签

ScreenDetailed 接口的 left 属性返回一个 number,代表总屏幕区域的 x 坐标

ScreenDetailed 接口的 top 属性返回一个 number,代表总屏幕区域的 y 坐标

指定屏幕打开窗口

调用 Window 接口的 open() 方法时,通过 windowFeatures 可选参数指定打开窗口的 left top width height 参数,从而实现指定屏幕打开窗口

1
2
3
4
5
6
const left = screenDetails.currentScreen.availLeft
const top = screenDetails.currentScreen.availTop
const width = screenDetails.currentScreen.availWidth / 2
const height = screenDetails.currentScreen.availHeight / 2

window.open('about:blank', '_blank', `left=${left},top=${top},width=${width},height=${height}`)

指定屏幕放置全屏

Element 接口 requestFullscreen() 方法的配置项支持传入 screen 参数,指定将全屏的窗口放置至指定屏幕

1
2
3
4
5
6
el.requestFullscreen({
screen:
screen.isExtended
? screenDetails.screens.filter(s => s !== screenDetails.currentScreen).at(0)
: screenDetails.currentScreen,
})

权限策略

该 API 受 window-management 权限策略的限制(无论是通过 Permissions-Policy 响应头指定抑或是通过 iframe 元素的 allow 属性指定)

默认为 self,即允许在当前上下文或内嵌的其他同源上下文中使用

权限 API

该 API 调用需要用户授予 window-management 权限,可以调用 Permission.query() 方法检查用户是否已授予了该权限

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
interface Screen extends EventTarget {
readonly isExtended: boolean

onchange: ((this: Screen, ev: Event) => any) | null
}

interface Window {
getScreenDetails(): Promise<ScreenDetails>
}

interface ScreenDetails extends EventTarget {
readonly screens: ScreenDetailed[]
readonly currentScreen: ScreenDetailed

onscreenschange: ((this: ScreenDetails, ev: Event) => any) | null
oncurrentscreenchange: ((this: ScreenDetails, ev: Event) => any) | null
}

interface ScreenDetailed extends Screen {
readonly availLeft: number
readonly availTop: number
readonly left: number
readonly top: number
readonly isPrimary: boolean
readonly isInternal: boolean
readonly devicePixelRatio: number
readonly label: string
}

interface FullscreenOptions {
screen: ScreenDetailed
}

链接

发布于

2023-11-04

更新于

2025-01-05

许可协议

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...