web-dev-qa-db-ja.com

IE11のwindow.ActiveXObjectの違い

IE11で私たちのサイトを調べて、現在何が壊れているかを調べていると、以下のコードが「true」と正しく評価されないことがわかりました。

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

さらに調査すると、typeof(window.ActiveXObject)"undefined"になりますが、IE10モードでは"function"になります=。 window.ActiveXObjectをウォッチリストに追加すると、関数タイプとして表示されます。同様に、typeof(window.ActiveXObject.prototype)を実行すると、IE11とIE10の両方で"object"を取得します。

なぜこれが変更されたのか、またはIE10とIE11の間のこれらのタイプの違いのリストをどこで見つけることができるのかを知っていますか?


PDATE 10/30/13:

これを入れたとき、私はもともとこれがIE11 javascriptエンジンのType評価との違いだと思っていました。それ以来、この問題はwindow.ActiveXObjectオブジェクトに固有のものであることに気付きました。そのため、この質問の名前を「IE11のTypeofの違い」から「IE11のwindow.ActiveXObjectの違い」に変更しました。

25
Kevin Heidt

IE11でそのチェックを使用することはできません。

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

IE11以降、ナビゲーターオブジェクトはプラグインとmimeTypesプロパティをサポートしています。さらに、window.ActiveXObjectプロパティはDOMから隠されています。 (つまり、このプロパティを使用してIE11を検出することはできなくなります。)

20
Joe

以下はIE11で機能します。

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

しかし、これはより良く、より信頼性が高い:

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

次のコードを使用してIEを検出できます

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

この回答 にコメントを追加できません。ごめんなさい。

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
3
Garlaro

実際、私が観察しているのは、IE9でこれらの両方がtrueと評価されることです。

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

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

しかし、IE11では、最初のステートメントはfalseと評価され、2番目のステートメントはtrueと評価されます。この動作の説明はありませんが、(ウィンドウ内の「ActiveXObject」)オプションの方が信頼性が高いことを示唆しています。

3
tlfu

私は「あの男」になりたくないが、

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

undefinedは代入可能であるため、mhuの答えよりも若干安全です。

2
Jacob

ライブラリのサンプルコード:

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