web-dev-qa-db-fra.com

window.ActiveXObject différence dans IE11

En parcourant notre site dans IE11 pour découvrir ce qui est cassé maintenant, nous avons remarqué que le code ci-dessous n'évalue pas correctement "vrai":

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

Après une enquête plus approfondie, il apparaît que typeof (window.ActiveXObject) entraîne "undefined", alors qu'en mode IE10, il en résulte "function" =. Lorsque j'ajoute window.ActiveXObject à la liste de surveillance, il apparaît comme étant un type de fonction. De même, si je fais typeof (window.ActiveXObject.prototype), j'obtiens "object" pour IE11 et IE10.

Est-ce que quelqu'un sait pourquoi cela a changé, ou où je peux trouver une liste de ces types de différences entre IE10 et IE11 afin que je puisse comprendre quels sont les autres changements de rupture?


MISE À JOUR 30/10/13:

Quand j'ai mis cela, j'avais pensé à l'origine que c'était une différence avec l'évaluation de type dans le moteur javascript IE11. Depuis, je me rends compte que ce problème est spécifique à l'objet window.ActiveXObject. J'ai donc changé le nom de cette question de "Différence de type dans IE11" en "fenêtre. Différence d'ActiveXObject dans IE11"

25
Kevin Heidt

Vous ne pouvez pas utiliser cette vérification pour IE11:

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

À partir d'IE11, l'objet navigateur prend en charge les plugins et les propriétés mimeTypes. De plus, la propriété window.ActiveXObject est masquée du DOM. (Cela signifie que vous ne pouvez plus utiliser la propriété pour détecter IE11.)

20
Joe

Les travaux suivants dans IE11:

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

Mais c'est mieux et plus fiable:

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

Vous pouvez utiliser le code suivant pour détecter IE

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

Impossible d'ajouter un commentaire à cette réponse , désolé.

J'ai trouvé que dans IE11 vous ne pouvez pas utiliser"ActiveXObject" in window afin de vérifier la prise en charge réelle d'ActiveX.

La détection ActiveXObject échouera lorsqu'elle sera effectuée dans une instruction conditionnelle

Dans IE11

"ActiveXObject" in window
> true

et

typeof window.ActiveXObject
> "undefined"

mais (c'est là que IE se trouve)

window.ActiveXObject !== undefined
> true

donc apparemment, seule cette vérification est fiable

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

IE10

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

En fait, ce que j'observe, c'est que dans IE9, ces deux valeurs sont vraies:

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

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

Mais dans IE11, la première déclaration est fausse, tandis que la seconde est vraie. Je n'ai pas d'explication à ce comportement, mais cela suggère que l'option ("ActiveXObject" dans la fenêtre) est plus fiable.

3
tlfu

Je déteste être "ce mec", mais

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

est légèrement plus sûr que la réponse de mhu car undefined est assignable.

2
Jacob

Échantillon de code de notre bibliothèque:

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;
}
1
Aldekein