12

Web サーバー (http 経由) またはファイル システム (file:// URL) から実行することを意図した JavaScript アプリケーションを開発しています。

このコードの一部として、XMLHttpRequest を使用して、ページと同じディレクトリとページのサブディレクトリにあるファイルをロードする必要があります。

このコードは、Web サーバーで実行すると正常に動作します (「合格」) が、ファイル システムから実行すると Internet Explorer 8 で動作しません (「不合格」)。

<html><head>
<script>
window.onload = function() {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", window.location.href, false);
  xhr.send(null);
  if (/TestString/.test(xhr.responseText)) {
    document.body.innerHTML="<p>PASS</p>";
  }
}
</script>
<body><p>FAIL</p></body>

もちろん、最初はスクリプトがファイル システム上でまったく実行できないため失敗します。ユーザーには、「セキュリティを保護するために、Internet Explorer により、この Web ページは、コンピューターにアクセスする可能性のあるスクリプトまたは ActiveX コントロールの実行が制限されています」という警告が表示されます。

しかし、バーをクリックして「ブロックされたコンテンツを許可」しても、ページはまだ失敗します。xhr.open 呼び出しで「アクセスが拒否されました」というエラーが表示されます。

MSDNは、「開発目的で、file:// プロトコルはローカル マシン ゾーンから許可されている」と述べているため、これは私を困惑させます。このローカル ファイルは、ローカル マシン ゾーンの一部である必要があります。

このようなコードを機能させるにはどうすればよいですか? ユーザーにセキュリティ警告を表示しても問題ありません。コントロール パネルでセキュリティを無効にするよう強制するのは、私にはよくありません。

編集:実際、私の場合、XML ドキュメントをロードしていません。プレーン テキスト ファイル (.txt) を読み込んでいます。

4

5 に答える 5

8

うーん、ネイティブの XMLHttpRequest オブジェクトと ActiveX オブジェクトの違いでしょうか? そのことについて、私は何かを覚えているようです。つまり、代わりに

var xhr = new XMLHttpRequest();

試す

var xhr = new ActiveXObject("MSXML2.XMLHTTP");

明らかに、ブラウザーが ActiveX をサポートしているかどうかを確認するために、いくつかのチェックを行います。もちろん、これも IE のみに限定されます。

于 2010-01-26T20:04:17.707 に答える
8

このようなコードを機能させるにはどうすればよいですか?

上記のように、これは の障害のようMicrosoft XMLHttpRequestです。jQuery (2011 年 7 月) も次のように書いています。

Microsoft は IE7 で XMLHttpRequest を適切に実装できませんでした (ローカル ファイルを要求できません)

IE8でもこの失敗を確認しています。

解決策は、うまくいかないnew window.ActiveXObject( "Microsoft.XMLHTTP" )場合にローカルファイルに使用することです。XMLHttpRequest

失敗xhr.openは行にあるため、そこでキャッチしてActiveXObject、次のように試してください:-

var xhr = new XMLHttpRequest()
try {
    xhr.open('GET', url, true)
}
catch(e) {
    try {
        xhr = new ActiveXObject('Microsoft.XMLHTTP')
        xhr.open('GET', url, true)
    }
    catch (e1) {
        throw new Error("Exception during GET request: " + e1)
    }
}

XMLHttpRequestMicrosoft が障害を修正した場合、このコードは少なくとも IE9 (未テスト) および将来の IE ブラウザの標準を使用します。上記のjQueryコードでは、Microsoft が障害を修正したとしても、利用可能な場合はMicrosoft.XMLHTTPいつでも非標準が使用されます。ActiveXObject

于 2011-07-31T07:05:33.330 に答える
7

私はたまたままったく同じ問題に遭遇しました。上で示唆したように、非ネイティブのActiveX「コンストラクター」は機能します。2つのオブジェクトに異なるポリシーが適用されているかどうかはわかりませんが、jQueryでも同じ問題が言及されているため、本物のバグである可能性があります。jQueryソースからの関連するコードは次のとおりです(1.4.2、4948行目)。

// Create the request object; Microsoft failed to properly
// implement the XMLHttpRequest in IE7 (can't request local files),
// so we use the ActiveXObject when it is available
// This function can be overriden by calling jQuery.ajaxSetup
xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
    function() {
        return new window.XMLHttpRequest();
    } :
    function() {
        try {
            return new window.ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {}
    }
于 2010-05-02T10:37:19.117 に答える