Window.ActiveXObject разница в IE11
При просмотре нашего сайта в IE11, чтобы узнать, что сломалось сейчас, мы заметили, что приведенный ниже код не оценивает "true" правильно:
this.isIEBrowser = false;
if (window.ActiveXObject){
this.isIEBrowser = true;
}
При дальнейшем исследовании кажется, что typeof (window.ActiveXObject) приводит к "undefined" , тогда как в режиме IE10 это приводит к функция ". Когда я добавляю window.ActiveXObject в список просмотра, он отображается как тип функции. Точно так же, если я делаю typeof (window.ActiveXObject.prototype), я получаю " объект" для IE11 и IE10.
Кто-нибудь знает, почему это изменилось, или где я могу найти список этих типов различий между IE10 и IE11, чтобы я мог выяснить, какие другие нарушения происходят?
ОБНОВЛЕНИЕ 10/30/13:
Когда я вложил это, я изначально думал, что это имеет значение с оценкой типа в JavaScript-движке IE11. С тех пор я понял, что эта проблема специфична для объекта window.ActiveXObject. Таким образом, я изменил название этого вопроса с "Разница типов в IE11" на "window.ActiveXObject разницу в IE11"
Ответы
Ответ 1
Вы не можете использовать эту проверку для IE11:
http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx
Начиная с IE11, объект навигатора поддерживает плагины и Свойства mimeTypes. Кроме того, свойство window.ActiveXObject скрыт от DOM. (Это означает, что вы больше не можете использовать свойство для обнаружения IE11.)
Ответ 2
В IE11 работает следующее:
this.supportActiveX = ("ActiveXObject" in window);
Но это лучше и надежнее:
this.supportActiveX =
(Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(window, "ActiveXObject")) ||
("ActiveXObject" in window);
Ответ 3
Вы можете использовать следующий код для обнаружения IE
var iedetect = 0;
if(window.ActiveXObject || "ActiveXObject" in window)
{
iedetect = 1;
}
Ответ 4
Я ненавижу быть "этим парнем", но
this.supportActiveX = (typeof window.ActiveXObject !== 'undefined')
немного безопаснее, чем ответ mhu, поскольку undefined можно присваивать.
Ответ 5
Собственно, я наблюдаю, что в IE9 оба они оцениваются как true:
this.supportActiveX = (typeof window.ActiveXObject !== 'undefined');
this.supportActiveX = ("ActiveXObject" in window);
Но в IE11 первый оператор оценивается как false, а второй - true. У меня нет объяснения этого поведения, но он предполагает, что опция ( "ActiveXObject" в окне) более надежна.
Ответ 6
Невозможно добавить комментарий к этому ответ, извините.
Я обнаружил, что в IE11 вы не можете использовать "ActiveXObject" in window
, чтобы проверить фактическую поддержку ActiveX.
Обнаружение ActiveXObject не будет выполнено при выполнении в условном Заявление
В IE11
"ActiveXObject" in window
> true
и
typeof window.ActiveXObject
> "undefined"
но (это где IE лежит)
window.ActiveXObject !== undefined
> true
поэтому, по-видимому, только эта проверка надежна
typeof window.ActiveXObject !== "undefined"
> false
IE10
typeof window.ActiveXObject !== "undefined"
> true
Ответ 7
Пример кода из нашей библиотеки:
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;
}