XRSession: select 事件

可用性有限

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

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

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

当会话的一个输入源完成了 主要操作 时,WebXR select 事件会发送给 XRSession

beforexrselect 事件触发后,会引发此事件,并且可以阻止此事件被触发。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("select", (event) => { })

onselect = (event) => { }

事件类型

一个 XRInputSourceEvent。继承自 Event

Event XRInputSourceEvent

事件属性

除了下面列出的属性之外,父接口 Event 的属性也可使用。

frame 只读

一个 XRFrame 对象,提供事件发生期间所需的事件帧信息。此帧可能是在过去渲染的,而不是当前的帧。因为这是一个事件帧,而不是动画帧,所以您不能在其上调用 XRFrame.getViewerPose();而是使用 getPose()

inputSource 只读

一个 XRInputSource 对象,指示是哪个输入源生成了此输入事件。

描述

触发

当用户按下触发器或按钮、轻触触摸板、说出命令或在使用视频跟踪系统或带加速度计的手持控制器时执行可识别的手势时,会触发此事件。

用例

selectstartselectend 事件会告知您何时可能需要向用户显示一些内容,以指示主要操作正在进行。这可能包括用新颜色绘制带有激活按钮的控制器,或者在 `selectstart` 到达时开始、在 `selectend` 收到时停止显示被抓取和移动的目标对象。

select 事件会告知您的代码用户已完成一项操作。这可能很简单,比如在游戏中扔一个物体或扣动枪的扳机,或者像将拖动的物体放置在新位置一样复杂。

如果您的主要操作是一个简单的触发器操作,并且您在触发器接合期间不需要为任何内容设置动画,您可以忽略 selectstartselectend 事件,并在开始事件上执行操作。

示例

以下示例使用 addEventListener() 来设置 `select` 事件的事件处理程序。该处理程序获取代表 `tracked-pointer` 输入的目标射线(ray)的姿态,并将姿态的变换发送到一个名为 `myHandleSelectWithRay()` 的函数。

js
xrSession.addEventListener("select", (event) => {
  if (event.inputSource.targetRayMode === "tracked-pointer") {
    let targetRayPose = event.frame.getPose(
      event.inputSource.targetRaySpace,
      myRefSpace,
    );
    if (targetRayPose) {
      myHandleSelectWithRay(targetRayPose.transform);
    }
  }
});

您也可以通过将 XRSession 对象的 `onselect` 事件处理程序属性设置为处理该事件的函数来设置 `select` 事件的处理程序。

js
xrSession.onselect = (event) => {
  if (event.inputSource.targetRayMode === "tracked-pointer") {
    let targetRayPose = event.frame.getPose(
      event.inputSource.targetRaySpace,
      myRefSpace,
    );
    if (targetRayPose) {
      myHandleSelectWithRay(targetRayPose.transform);
    }
  }
};

规范

规范
WebXR Device API
# eventdef-xrsession-select
WebXR Device API
# dom-xrsession-onselect

浏览器兼容性

另见