我选择避免将浏览器识别为不可靠和混乱。相反,我只是测试我的页面使用的每个元素或API的实际支持。为了测试音频支持,我想出了这个。
function testAudio()
{
if(window.AudioContext = window.AudioContext)
{
myAudio = new AudioContext();
alert("Browser supports AudioContext");
}
else
{
if(window.Audio = window.Audio)
{
myAudio = new Audio();
alert("Browser supports Audio Element");
}
else {alert("This browser does not support AudioContext or Audio Element");}
}
}
像魅力一样工作。当前浏览器对AudioContext返回true,IE11仅对Audio()返回true,IE 8为两者返回false。但是为什么?
在true的情况下,我将对象分配给window对象的object属性。是否有窗口对象的AudioContext和Audio元素属性?或者浏览器返回true以分配给可能存在但不存在的对象?
在false的情况下,我将浏览器无法识别的对象分配给不存在的窗口对象的属性。为什么它返回false而不是抛出错误,null或undefined?
时,为什么会返回falseif(myAudio = new AudioContext()) or if(myAudio = new Audio()) throw errors?
答案 0 :(得分:3)
IE8不完全支持HTML5,其中包括Audio
API。如果您需要IE8支持,则需要包含a polyfill。
当您尝试使用不存在的对象原型(即new AudioContext()
)实例化新对象时,您应该会遇到错误。但是if (window.AudioContext)
只是检查属性的存在 - 它不是在调用函数,所以没有错误。
您在此处遇到的问题是,这是检查浏览器是否支持相关API的奇怪方法。
例如,
if (window.Audio = window.Audio)
IE8中的将与此相同:
if (window.Audio = undefined)
,如果删除作业,可以简化为:
if (undefined)
这是假的,这意味着它会得到与此相同的结果:
if (false)
所以你永远不会进入那个街区。