Подтвердить что ты не робот

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"

4b9b3361

Ответ 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;
}