除了Mac 10.14.5上的Safari 12.1.1之外,以下内容在每种浏览器中均能很好地工作:
new Audio('data:audio/mpeg;base64,/+MQxAAIi0Y4AUEQAfIAFABf///////////////////////////////OdyAYt4Aq///////jEsQECbvSvAGAaAD///////////////////+nX/+j//rc3//+scAljr//6h3BSxx+PB///+MQxAUKA4M8B4BpIv/////////////////+pX/5V//pLRUu3///2CZifmzf/+dS///////jEMQECZvWxAGAUAD/////////////////0b////1//54Xhr//+FcVzv//UYhE6gKAHSP/4xDEBAnDQtQfwBAD////////R/////////////lQxtrrqVGRysaVP/a6//QMwVrChGFZ/+MSxAQG41JAAAgPHIV4v////VjvR///////mlQBgmNQk8tiKmxY0z/////7f//+tH//rR//4xDEEAUwAegACES8//5YJmZMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/+MQxCIAAANIAAAAAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==').play();
直接在Safari的控制台中执行代码会产生以下结果:
承诺= $ 2
结果:NotAllowedError:用户代理不允许该请求 或当前上下文中的平台,可能是因为用户 拒绝权限。
代码:0
列:602
行:3
消息:“用户代理或平台不允许该请求 在当前情况下,可能是因为用户拒绝了许可。”
名称:“ NotAllowedError”
堆栈:“播放@ [本地代码]↵全局 代码↵evaluateWithScopeExtension@ [native 代码]↵_evaluateOn↵_evaluateAndWrap“
DOMException原型
状态:“已拒绝”
承诺原型
catch(rejectionHandler)
构造函数:function()
finally()
然后(resolvedHandler,拒绝处理程序)
Symbol(Symbol.toStringTag):“承诺”
对象原型
如果代码可以调整为忽略此错误,那是什么?如果不能忽略此错误,我应该使用哪种代码来避免触发错误?
没有框架/库。
运行Safari 8.0的经过验证的用户无法触发new Audio
。我添加了if (typeof new Audio == 'object')
,最终导致了整个问题。