2013-10-28 39 views
21

window.ActiveXObject差異雖然找過我們在IE11的網站找出現在什麼地方不對頭,我們注意到下面的代碼不評估爲「真」正確:在IE11

this.isIEBrowser = false; 
if (window.ActiveXObject){ 
    this.isIEBrowser = true; 
} 

經進一步調查,看起來typeof(window.ActiveXObject)導致「undefined」,而在IE10模式下,它導致「功能」。當我將window.ActiveXObject添加到監視列表中時,它將顯示爲函數類型。同樣,如果我做typeof(window.ActiveXObject.prototype),我得到「對象」爲IE11和IE10。

是否有人知道爲什麼會發生這種變化,或者我可以在IE10和IE11之間找到這些類型差異的列表,以便我可以找出其他哪些突變更改?


更新13年10月30日:

當我把這個,我原本以爲這是在IE11的JavaScript引擎型式評價的差異。我後來意識到這個問題是特定於window.ActiveXObject對象的。所以,我已經改變了從「在IE11 TYPEOF差異」這個問題「在IE11 window.ActiveXObject差」

+1

很肯定這是對IE11所取得的刻意改變一個擁有它避免陷入傳統IE檢查。 – BoltClock

回答

16

的名稱不能使用IE11,辦理入住手續:

http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx

從IE11開始,導航器對象支持插件和mimeTypes屬性。另外,window.ActiveXObject屬性 對DOM隱藏。 (這意味着你不能再使用屬性 檢測IE11)

+7

謝謝喬,那個鏈接很有幫助。我在[link](http://bugs.jquery.com/ticket/14475)上找到了一個與window.ActiveXObject相關的jquery票據,它指向[link](http://msdn.microsoft.com/en-us/) library/ff955298(v = vs.85).aspx)解釋ActiveXOBject檢測將在條件內失敗(我的OP示例)。使用'window.ActiveXObject!== undefined'的jquery票據建議起作用,其他地方的另一個建議是在窗口中使用''ActiveXObject「。我也看到了try/catch方法,但我不想實例化一個activex,只檢查它是否存在,因此IE –

+1

試圖以這種方式檢測IE是短視的,因爲它明確地說明了IE團隊是什麼試圖預防,並且他們的兼容性謊言在未來的版本中可能會提高。相反,功能檢測您需要的實際功能。 – EricLaw

+1

@EricLaw,如果你需要的功能是ActiveX?我不想實例化一個實際的ActiveX對象來檢查它。 –

1

代碼示例,從我們的圖書館:

if (document.implementation && document.implementation.createDocument && typeof XSLTProcessor != 'undefined') { 
    // chrome, firefox etc 
} 
else try { 
    // IE 
    var xml = new ActiveXObject("MSXML2.DOMDocument"); 
    var xsl = new ActiveXObject("Microsoft.XMLDOM"); 
} 
catch (e) { 
    // no support 
    console.log('transformxml: no browser support'); 
    return null; 
} 
19

在IE11以下工作:

this.supportActiveX = ("ActiveXObject" in window); 

但這更好更可靠:

this.supportActiveX = 
    (Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, "ActiveXObject")) || 
    ("ActiveXObject" in window); 
+0

是的,按照上述的答案。 ActiveXObject在IE11中未定義。所以它可能存在於'window'中,但是可能是'undefined'。所以不要這樣做。做'this.supportActiveX =(window.ActiveXObject ==未定義!);' – hexalys

+0

發現使用getOwnPropertyDescriptor更好的檢查:https://groups.google.com/d/msg/comp.lang.javascript/EOziMLM_zEc/kudaP8ng50IJ – mhu

2

我討厭被「那個傢伙」,但

this.supportActiveX = (typeof window.ActiveXObject !== 'undefined') 

比MHU的回答就更安全,因爲undefined是分配。

+1

你是正確的,但檢查不正確,請參閱更新我的回答 – mhu

2

其實,我觀察到的是,在IE9這兩個評價爲真:

this.supportActiveX = (typeof window.ActiveXObject !== 'undefined'); 

this.supportActiveX = ("ActiveXObject" in window); 

但在IE11中,第一條語句計算結果爲false,而第二個是真實的。我沒有解釋這種行爲,但它表明(窗口中的「ActiveXObject」)選項更可靠。

+0

+1:你說得對。在這種情況下不應該使用Typeof。更新了我的答案。 – mhu

3

您可以使用下面的代碼來檢測IE

var iedetect = 0; 
if(window.ActiveXObject || "ActiveXObject" in window) 
{ 
    iedetect = 1; 
} 
2

不能添加註釋this answer,對不起。

我發現在IE11中你can't use"ActiveXObject" in window爲了檢查實際的ActiveX支持。條件 語句內執行時

在IE11

"ActiveXObject" in window 
> true 

typeof window.ActiveXObject 
> "undefined" 

但(這是其中IE在於)

的ActiveXObject檢測將失敗

window.ActiveXObject !== undefined 
> true 

所以顯然只有這個檢查是可靠

typeof window.ActiveXObject !== "undefined" 
> false 

IE10

typeof window.ActiveXObject !== "undefined" 
> true