XRSystem

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

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();
    });
  }
}

此代码首先通过查找 navigator.xr 属性来检查 WebXR 是否可用。如果找到,则表示 WebXR 存在,然后我们继续为用户可以点击以开启和关闭沉浸式 VR 模式的按钮建立一个处理程序。

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

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

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

规范

规范
WebXR Device API
# xrsystem-interface

浏览器兼容性