【发布时间】:2019-12-21 13:37:10
【问题描述】:
我有一个带有用于扫描产品的输入字段的页面。当扫描条形码或在字段中输入 SKU 时,会发出 ajax 请求,应用程序会根据使用 HTMLMediaElement.play() 的响应播放成功或错误声音。
sounds.error.play();
这在前一段时间工作正常,但现在我收到此错误:
⚠ 只有在用户批准、用户激活网站或媒体静音时才允许自动播放。
接着是:
NotAllowedError:当前上下文中用户代理或平台不允许播放方法,可能是因为用户拒绝了权限。
由于此页面仅用于扫描 SKU,因此当页面加载时,该输入字段会以编程方式聚焦,以便最终用户更轻松地进行操作。我尝试删除此焦点,以便用户必须单击输入字段,但这似乎不满足允许播放音频的任何要求
经过更多试验后,我发现通过一些额外的用户交互,声音会播放。例如,如果我创建一个复选框来“启用”声音并且用户单击它,这似乎就足够了。或者,如果用户在输入元素之外单击,然后再次返回,这也可以。
满足大多数现代浏览器以允许播放音频的确切要求是什么?
我意识到对于不同的浏览器和配置,答案可能会有所不同,但我无法为当前版本的 Firefox 或 Chrome 找到任何权威。我正在寻找一种解决方法,以便应用程序不需要因额外的点击或其他类型的交互而变得复杂,并且由于我现在知道这项新政策,我希望修订尽可能不引人注目。
更新:
这是我为演示该问题而设计的一个基本示例。我刚才尝试了三种不同的浏览器,它们的行为都有些不同。特别是 Firefox 的行为如上所述 - 直到我关注输入字段,模糊,然后再次单击以聚焦时才会播放声音:
【问题讨论】:
-
查看最近的autoplay policy announcement。这取决于网站的 ME 指数。至少,有 canplay js 库来检查是否可以自动播放。
-
@bigless - 我在谷歌上搜索了“canplay js”,但一无所获。你能给我一个链接吗?如果不尝试播放并捕捉到 promise 错误,我就无法做出这个决定——这需要我先尝试播放声音。
-
对不起。它是can-autoplay
标签: javascript google-chrome firefox audio