测试浏览器对HTML5元素和API的支持。为什么这样做

时间:2017-06-06 18:16:04

标签: javascript html5 audio

我选择避免将浏览器识别为不可靠和混乱。相反,我只是测试我的页面使用的每个元素或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?

时,为什么会返回false
if(myAudio = new AudioContext()) or if(myAudio = new Audio()) throw errors?

1 个答案:

答案 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)

所以你永远不会进入那个街区。