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
相关产品推荐
相关产品推荐

