我有一个带有用于扫描产品的输入字段的页面。当扫描条形码或在字段中输入 SKU 时,会发出 ajax 请求,应用程序会播放成功或错误声音,具体取决于使用 HTMLMediaElement.play()
的响应。
sounds.error.play();
前一段时间工作正常,但现在出现此错误:
⚠ 只有在用户批准、网站被用户激活或媒体静音时才允许自动播放。
其次是:
NotAllowedError:当前上下文中的用户代理或平台不允许播放方法,可能是因为用户拒绝了权限。
由于此页面仅用于扫描 SKU,因此当页面加载时,该输入字段以编程方式聚焦,以便最终用户更轻松地进行操作。我尝试删除此焦点,以便用户必须单击输入字段,但这似乎不能满足允许播放音频的任何要求
经过更多的实验后,我发现通过一些额外的用户交互,声音将会播放。例如,如果我创建一个复选框来“启用”声音并且用户单击它,这似乎就足够了。或者,如果用户在输入元素外部单击,然后再次返回输入元素,这也有效。
满足大多数现代浏览器以便允许播放音频的具体要求是什么?
我意识到不同的浏览器和配置的答案可能不同,但我无法找到任何关于当前版本的 Firefox 或 Chrome 的权威信息。我正在寻找一种解决方法,这样应用程序就不需要因额外的点击或其他类型的交互而变得复杂,而且由于我现在知道这项新政策,所以我希望修改尽可能不引人注目。
更新:
这是我用来演示该问题的基本示例。我刚才尝试了三种不同的浏览器,它们的行为都有些不同。尤其是 Firefox 的行为如上所述 - 直到我专注于输入字段,模糊,然后再次单击以再次聚焦时才会播放声音:
http://so.dev.zuma-design.com/input-sounds.html
原文由 Eaten by a Grue 发布,翻译遵循 CC BY-SA 4.0 许可协议
[编辑] Firefox 70 修复了这个问题。该答案的其余部分提供了解释和建议的解决方法。
正如您 想知道 “用户已与网站进行交互” 标准的具体含义:
具体来说,在当前的 Firefox 开发版本中,以下事件不会使页面“用户手势激活”( 代码):
contenteditable
),例如键入/单击文本输入; - 这是影响您的用例的异常;现在已在 Firefox 70 中删除。一个想法——从一个假的/模糊的文本框开始,在输入第一个字符后显示/聚焦真实的文本框(通过 JS 将第一个字符添加到文本输入中)——以下代码似乎在 Firefox 中工作:
如果用户通过单击文本输入开始,这将无济于事,但可以为这种情况实施后备无声反馈。