10

私はw3schoolsからXMLHttpRequestを学んでいます。次のコードスニペットがわかりません。何window.XMLHttpRequestを意味しますか?何がそれを真または偽にしますか?この全体のif/else構造は、ie6とie5を説明するためだけにありますか?そうであれば、すべてを1行で置き換えることができますxmlhttp = new XMLHttpRequest()か?

 if (window.XMLHttpRequest) {
     // code for IE7+, Firefox, Chrome, Opera, Safari
     xmlhttp = new XMLHttpRequest();
 } else {
     // code for IE6, IE5
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
4

3 に答える 3

4

はい、私はharschwareに同意します。複雑なフィールドであるため、クロスブラウザツールがあると役立ちます。

上記のコードは、XMLHTTPRequestオブジェクトを作成するクロスブラウザーコードスニペットです。

ブラウザのチェックではなく機能のチェックに依存しているため、適切に構成されています。http://www.javascripttoolbox.com/bestpractices/にあるこの記事「ブラウザではなく機能の検出-検出」を 参照してください。

したがって、この:

if (window.XMLHttpRequest)

--ブラウザにXMLHttpRequest機能がグローバル関数(ウィンドウオブジェクトのメンバー)として実装されているかどうかを検出します。実装されている場合は、XMLHttpRequestオブジェクトがそのように構築されます。

それ以外の場合、コードは、ActiveXObject関数を呼び出すことによってXMLHttpRequestを作成できると盲目的に想定します。これは、前述のようにIE5およびIE6でそのようなオブジェクトを作成する方法です。

最後の仮定は、ブラウザにその機能がないか、別の方法で実装されている可能性があるため、正しくない可能性があります。最後のケースでは例外が発生する可能性があります。

于 2012-04-21T15:59:09.650 に答える
2

概要

...inif (window.XMLHttpRequest) { ... }は、standard-XHRがサポートされている場合にのみ評価されます。それ以外の場合、ActiveXはIE5-6をサポートするために使用されます。

XMLHttpRequestAPI仕様がサポートされているかどうかを確認するには、グローバルXMLHttpRequestオブジェクトが存在するかどうかをテストします。はグローバルオブジェクトなので、プロパティwindowの存在を確認するだけです。{1}window.XMLHttpRequest

以下に示すの!は、論理NOT演算子であり、内部の結果を表示するために使用されif (window.XMLHttpRequest)ます。

    if (window.XMLHttpRequest)
    // Supported:
    !!window.XMLHttpRequest === !![object XMLHttpRequest] === !false === true
    // Not supported, so the property does not exist, and is undefined
    !!window.XMLHttpRequest === !!undefined               === !true  === false

しかし、それで話は終わりではありません。XHRの概念は、ブラウザに最初に実装したMicrosoftから、ActiveXObjectInternetExplorer5.0を介して生まれました。その後、バージョン7.0で、Microsoftは標準化されたXHRAPIのサポートを追加しました。

IE5についてはもう誰も気にしません。ただし、IE6ユーザーの数はまだかなり多くなっています(約1%)。したがって、次の方法でIE5-6をサポートすることも問題ありません。

... } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }


{1}:考慮すべき他の方法:

  • if (typeof window.XMLHttpRequest !== 'undefined')-これも機能します。
  • if (XMLHttpRequest)-使用しないでください。変数が存在しない場合(=宣言されていない場合)、ReferenceError:XMLHttpRequestは未定義です`がスローされます
于 2012-04-22T07:59:47.173 に答える
1

XMLHTTPの話は、 XMLHTTPとXMLHttpRequestに関するいくつかの興味深い歴史を共有していました。簡単に言うと、XMLHTTPはMicrosoftによってActiveXオブジェクトとして導入されました。new ActiveXObject("Microsoft.XMLHTTP")またはを使用して作成する必要があります。詳細については、InternetExplorerでの適切なバージョンのMSXMLの使用をnew ActiveXObject("MSXML2.XMLHTTP.6.0")参照してください。その後、他のブラウザベンダーはこのコンポーネントが便利であることに気付き、W3Cと協力して、ウィンドウオブジェクトのネイティブオブジェクトであり、でインスタンス化できるXMLHttpRequestの名前で標準化しました。ただし、IE6やIE5などのすべてのブラウザがXMLHttpRequestオブジェクトをサポートしているわけではないため、一般的な方法は、XMLHttpRequestオブジェクトがウィンドウオブジェクトの有効なオブジェクトであるかどうかを検出することです。お役に立てれば。new XMLHttpRequest()if (window.XMLHttpRequest)

于 2012-04-21T15:50:46.597 に答える