You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GameController API是否需要持续轮询navigator.getGamepads()

问题

文末附更新说明!

请问在GameController API中,是否需要持续轮询navigator.getGamepads()方法?

提出该疑问的原因是:单次调用该函数返回的数组长度为0,但已在Mac的蓝牙系统偏好设置中确认Nimbus+游戏手柄已正常连接。这种情况是否需要使用setInterval持续检测,直到返回数组长度大于0?

更新内容

测试环境为搭载Monterey OS 12.4系统的Macintosh设备,各浏览器调用接口的返回结果如下:

Safari (15.5) reports length = 0
Firefox (102.0b6) reports length = 0
Chrome (102.0.5005.115) reports length = 4,
   but each in the array being = null

回答

不需要在页面加载后就无脑用setInterval持续轮询navigator.getGamepads(),你遇到的返回空/全null数组的情况是API本身的安全策略和触发逻辑导致的,不是设备连接故障:

  • 浏览器出于安全限制,不会在页面无用户交互、手柄无输入的情况下暴露已连接的游戏手柄设备。哪怕手柄已经在系统层面完成蓝牙配对连接,只要用户没有和页面产生过交互(点击、按键等)、手柄没有在页面获得焦点后按下过任意按键,调用接口就会返回空数组。Chrome下出现的长度为4但元素全为null的返回,是浏览器预留的手柄槽位,不代表识别到了有效设备。
  • 标准的检测逻辑是监听gamepadconnected事件,当浏览器成功识别到可用手柄时会触发该事件,此时再调用navigator.getGamepads()就能拿到正确的手柄实例。
  • 做兼容兜底时,可以在页面的点击、按键交互回调里触发一次navigator.getGamepads()检测即可,不需要高频持续轮询,既浪费性能也没有实际意义。

针对你使用Nimbus+手柄在Mac端测试的补充说明:
测试时先点击页面区域激活页面焦点,再按下手柄任意一个按键触发识别,之后再调用接口就能正常获取到手柄对象,页面加载初始化阶段直接调用接口必然拿不到有效数据。


内容的提问来源于stack exchange,提问作者user19147296

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:54:41