2013-10-28 6 views
21

Während über unsere Website in IE11 suchen, um herauszufinden, was jetzt kaputt ist, bemerkten wir, dass der Code unten auf „true“ nicht richtig bewerten:window.ActiveXObject Unterschied in IE11

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

Bei der weiteren Untersuchung, es scheint, dass typeof (window.ActiveXObject) Ergebnisse in "undefined", während im IE10-Modus ergibt sich "Funktion". Wenn ich der Beobachtungsliste window.ActiveXObject hinzufüge, wird dies als Funktionstyp angezeigt. Ähnlich, wenn ich typeof (window.ActiveXObject.prototype) mache, bekomme ich "Objekt" für IE11 und IE10.

Weiß jemand, warum dies geändert wurde, oder wo ich eine Liste dieser Arten von Unterschieden zwischen IE10 und IE11 finden kann, so dass ich herausfinden kann, welche anderen brechenden Änderungen es gibt? 10/30/13


UPDATE:

Als ich diesen in, hatte ich ursprünglich dachte, das eine Differenz mit Typ-Auswertung im IE11 JavaScript-Engine war. Ich habe inzwischen erkannt, dass dieses Problem für das window.ActiveXObject-Objekt spezifisch ist. Also habe ich den Namen dieser Frage aus "TypeOf Unterschied in IE11" auf "window.ActiveXObject Unterschied in IE11" geändert

+1

Ziemlich sicher, dass dies eine der absichtlichen Änderungen war zu IE11 gemacht wird, es zu haben zu vermeiden in Legacy-IE Kontrollen erwischt . – BoltClock

Antwort

16

Sie nicht, dass der Check für IE11 verwenden:

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

Beginnend mit IE11 unterstützt das Navigator-Objekt plugins und mimeTypes-Eigenschaften. Darüber hinaus ist die window.ActiveXObject-Eigenschaft aus dem DOM ausgeblendet. (Dies bedeutet, dass Sie nicht mehr die Eigenschaft verwenden können IE11 zu erkennen.)

+7

Danke Joe, dieser Link ist hilfreich. Ich habe ein jquery-Ticket gefunden, das sich auf window.ActiveXObject bezieht, unter [link] (http://bugs.jquery.com/ticket/14475), das auf [link] verweist (http://msdn.microsoft.com/en-us/). Bibliothek/ff955298 (v = vs.85) .aspx), die erklärt, dass die ActiveXOBject-Erkennung innerhalb einer Bedingung fehlschlägt (mein OP-Beispiel). Der Vorschlag des jquery-Tickets, "window.ActiveXObject! == undefined" zu verwenden, funktionierte ebenso wie ein anderer Vorschlag von "ActiveXObject" im Fenster "woanders". Ich habe die try/catch-Methode auch verwendet, aber ich möchte nicht ein Activex instanziieren, nur prüfen, ob es existiert und daher IE –

+1

Der Versuch, IE auf diese Weise zu erkennen, ist kurzsichtig, da es explizit das IE-Team ist Versuchen zu verhindern, und ihre Kompatibilität Lüge wird wahrscheinlich in einer zukünftigen Version verbessern. Stattdessen Feature Ermitteln Sie die tatsächlichen Funktionen, die Sie benötigen. – EricLaw

+1

@EricLaw, was ist, wenn das Feature, das Sie benötigen, ActiveX ist? Ich möchte kein aktuelles ActiveX-Objekt instanziieren, nur um das zu überprüfen. –

1

Codebeispiel aus unserer Bibliothek:

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

Folgende Arbeiten in IE11:

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

Aber diese besser und zuverlässiger:

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

Ja es funktioniert, laut obiger Antwort. ActiveXObject ist in IE11 nicht definiert. Es kann also in 'window' vorkommen, aber als 'undefined'. Also tu das nicht. Do 'this.supportActiveX = (window.ActiveXObject! == undefined);' – hexalys

+0

Eine bessere Überprüfung mit getOwnPropertyDescriptor gefunden: https://groups.google.com/d/msg/comp.lang.javascript/EOziMLM_zEc/kudaP8ng50IJ – mhu

2

Ich hasse „dieser Typ“ zu sein, aber

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

ist etwas sicherer als Antwort des MHU da nicht definiert zuordenbar ist.

+1

Sie sind richtig, aber die Überprüfung ist nicht korrekt, siehe aktualisiert meine Antwort – mhu

2

Eigentlich, was ich beobachtet, dass in IE9 diese beiden zu wahren bewerten:

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

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

Aber in IE11, die erste Anweisung das Ergebnis falsch, während der zweite wahr ist. Ich habe keine Erklärung für dieses Verhalten, aber es deutet darauf hin, dass die Option ("ActiveXObject" im Fenster) zuverlässiger ist.

+0

+1: Sie haben Recht. Typeof sollte in diesem Fall nicht verwendet werden. Meine Antwort wurde aktualisiert. – mhu

3

können Sie folgenden Code verwenden, um IE zu erkennen

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

Kann nicht Kommentar zu this answer hinzufügen, sorry.

Ich fand, dass in IE11 Sie can't use"ActiveXObject" in window, um für die tatsächliche ActiveX-Unterstützung zu überprüfen.

ActiveXObject Erkennung fehlschlagen, wenn sie innerhalb einer bedingten Anweisung ausgeführt

In IE11

"ActiveXObject" in window 
> true 

und

typeof window.ActiveXObject 
> "undefined" 

aber (dies ist, wo IE liegt)

window.ActiveXObject !== undefined 
> true 

so scheinbar nur diese Prüfung ist zuverlässig

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

IE10

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