2017-06-06 48 views
0

我選擇避免將瀏覽器識別爲不可靠和混亂。相反,我只是測試我的頁面使用的每個元素或API的實際支持。爲了測試音頻支持,我提出了這個問題。測試瀏覽器支持HTML5元素和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,對於兩者都返回false。但爲什麼?

在真的情況下,我將一個對象分配給窗口對象的對象屬性。是否有窗口對象的AudioContext和Audio元素屬性?或者,瀏覽器對於可能存在但不存在的對象的賦值返回true。

在虛假的情況下,我指定的瀏覽器不能識別到窗口對象不存在的屬性的對象。爲什麼它返回false而不是拋出一個錯誤,null或undefined?爲什麼會這樣返回false而

if(myAudio = new AudioContext()) or if(myAudio = new Audio()) throw errors? 
+1

根據caniuse.com的說法,從IE11和AudioContext開始支持音頻的Edge。你還會期待什麼? –

回答

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) 

這是falsy,這意味着這將有同樣的結果,因爲這:

if (false) 

所以你永遠不會進入該塊。

+0

你說得對。這項任務是無關緊要的。我是從MDN「if(window.AudioContext = window.AudioContext || window.webkitAudioContext)」,但這是多餘的語法。如果(window.AudioContext),如果(window.Audio)工作得很好,使更多的意義。 – illusivetech