Window Management API 允许获取连接到设备的显示器的详细信息,并将窗口放置在指定的屏幕上
检测是否多屏 Screen 接口的 isExtended 属性指示当前用户设备是否支持多屏
被 window-management 权限策略禁止时,始终返回 false
监测屏幕变化 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 }
链接