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"
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.)
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);
Vous pouvez utiliser le code suivant pour détecter IE
var iedetect = 0;
if(window.ActiveXObject || "ActiveXObject" in window)
{
iedetect = 1;
}
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
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.
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.
É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;
}