XRSystem - 提供了方法用于访问代表 WebXR 会话的 XRSession 对象
XRSystem
是 WebXR 设备 API 的接口, 提供了方法用于访问代表 WebXR 会话的 XRSession
对象。有了 XRSession
,您就可以使用它与增强现实(AR)或虚拟现实(VR)设备进行交互。
属性
虽然 XRSystem 直接不提供属性,但是从其父接口 EventTarget
继承了属性。
方法
除了从其父接口 EventTarget
继承的方法之外,XRSystem
接口还包括以下方法:
isSessionSupported()
返回一个 Promise
,如果浏览器支持给定的 XRSessionMode
,则将其解析为 true
。如果不支持指定的模式,则解析为 false
。
requestSession()
返回一个 Promise
,使用指定的 XRSessionMode
解析为新的 XRSession
。
事件
devicechange
当可用的 XR 设备集合已更改时触发。
也可以使用 ondevicechange
事件处理程序绑定。
使用注意
在规范的早期版本中,该接口以前名称为 XR
。如果在代码或文档中看到对 XR
的引用,则将其替换为 XRSystem
。
实例
以下实例显示如何同时使用 isSessionSupported()
和 requestSession()
。
if (navigator.xr) {
immersiveButton.addEventListener("click", onButtonClicked);
navigator.xr.isSessionSupported('immersive-vr')
.then((isSupported) => {
if (isSupported) {
immersiveButton.disabled = false;
} else {
immersiveButton.disabled = true;
}
});
}
function onButtonClicked() {
if (!xrSession) {
navigator.xr.requestSession('immersive-vr')
.then((session) => {
// 为了简洁起见,未显示 onSessionStarted() 的代码。
onSessionStarted(session);
});
} else {
// 关闭已经运行的 XRSession
xrSession.end()
.then(() => {
// 由于在某些情况下未发送结束事件,因此也请在此处调用处理程序。
onSessionEnded();
});
}
}
这段代码首先通过查找 navigator.xr
属性来检查 WebXR 是否可用。如果找到它,我们就知道存在 WebXR,因此我们将为按钮建立一个处理程序,用户可以单击该按钮以打开和关闭沉浸式 VR 模式。
但是,我们尚不知道所需的沉浸模式是否可用。为了确定这一点,我们调用 isSessionSupported()
,在启用 immersiveButton
按钮之前将所需的会话选项传递给它。然后,只有在沉浸式 VR 模式可用时,用户才能使用该选项切换到沉浸式模式。如果沉浸式 VR 不可用,则禁用该按钮以阻止被使用。
onButtonClicked()
函数检查是否已在运行会话。如果没有,我们使用 requestSession()
方法来启动一个会话,一旦返回的 Promise
解析,我们就调用 requestSession()
函数来建立会话进行渲染等等。
另一方面,如果已经有正在进行的 XR 会话,则改为调用 end()
来结束当前会话。当前会话结束时,将发送 end
事件,因此在其处理程序中将 xrSession
设置为 null
以记录我们不再有正在进行的回话。这样,如果用户再次单击该按钮,将开始新的会话。
规范
规范 | 状态 | 备注 |
---|---|---|
WebXR Device API XRSystem 的定义 |
工作草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 791 | 791 | 不支持 | 不支持 | 不支持 | 不支持 |
devicechange 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
isSessionSupported() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
ondevicechange | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
requestSession() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 不支持 | 791 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
devicechange 事件 | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
isSessionSupported() | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
ondevicechange | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
requestSession() | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
1. 通过 XR
支持。