XRSystem

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在某些或所有支持的浏览器中。

实验性:这是一个实验性技术
在生产环境中使用此功能前,请仔细查看浏览器兼容性表

WebXR 设备 API接口XRSystem提供了可用于获取表示 WebXR 会话的XRSession对象的方法。有了该XRSession,您可以使用它来与增强现实 (AR) 或虚拟现实 (VR) 设备进行交互。

EventTarget XRSystem

实例属性

虽然XRSystem本身不提供任何属性,但它确实继承了其父接口EventTarget的属性。

实例方法

除了继承其父接口EventTarget的方法外,XRSystem接口还包括以下方法

isSessionSupported() 实验性

返回一个 Promise,如果浏览器支持给定的会话模式,则解析为true。如果指定的模式不受支持,则解析为false

requestSession() 实验性

返回一个 Promise,该 Promise 解析为一个新的XRSession,并具有指定的会话模式。

事件

devicechange 实验性

当可用 XR 设备集发生变化时发送。也可以使用ondevicechange事件处理程序。

使用说明

此接口在规范的早期版本中之前称为XR;如果您在代码或文档中看到对XR的引用,请将其替换为XRSystem

示例

以下示例展示了如何使用isSessionSupported()requestSession()

js
if (navigator.xr) {
  immersiveButton.addEventListener("click", onButtonClicked);
  navigator.xr.isSessionSupported("immersive-vr").then((isSupported) => {
    immersiveButton.disabled = !isSupported;
  });
}

function onButtonClicked() {
  if (!xrSession) {
    navigator.xr.requestSession("immersive-vr").then((session) => {
      // onSessionStarted() not shown for reasons of brevity and clarity.
      onSessionStarted(session);
    });
  } else {
    // Shut down the already running XRSession
    xrSession.end().then(() => {
      // Since there are cases where the end event is not sent, call the handler here as well.
      onSessionEnded();
    });
  }
}

此代码首先检查 WebXR 是否可用,方法是查找navigator.xr属性。如果找到它,我们就知道 WebXR 存在,因此我们继续为用户可以单击以切换沉浸式 VR 模式开/关的按钮建立一个处理程序。

但是,我们还不知道所需的沉浸式模式是否可用。为了确定这一点,我们在启用按钮immersiveButton之前调用isSessionSupported(),将所需的会话选项传递给它,用户只有在沉浸式 VR 模式可用时才能使用该按钮切换到沉浸式模式。如果沉浸式 VR 不可用,则禁用该按钮以防止其使用。

onButtonClicked()函数检查是否有正在运行的会话。如果没有,我们使用requestSession()启动一个会话,并且一旦返回的 Promise 解析,我们就调用一个函数onSessionStarted()来设置我们的会话以进行渲染等等。

另一方面,如果已经存在正在进行的 XR 会话,我们改为调用end()以结束当前会话。当当前会话结束时,会发送end事件,因此在其处理程序中将xrSession设置为null以记录我们不再拥有正在进行的会话的事实。这样,如果用户再次单击按钮,将启动一个新的会话。

规范

规范
WebXR 设备 API
# xrsystem-interface

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。