2

私のAjaxクロスドメインリクエストは、IE9で「アクセスが拒否されました」で失敗します。私はこのトピックに関するいくつかの投稿を読みました、そしてそれがうまくいくはずです。

  1. IE9およびjQuery1.8.1
  2. 呼び出しはasync、、、jsonpcrossdomainです。これらは私が見つけた前提条件です。cachefalse
  3. 最新のFirefoxとChromeで動作します。
  4. jQuery.support.cors本当です
  5. 応答ヘッダーも設定されています:Access-Control-Allow-Origin:*SO
  6. 返されたJSONコードも正しく、チェッカーを使用しています(3も参照)。

では、なぜこれがAccessの拒否で失敗するのでしょうか?何か案が?私のコードが<script></script>ページ上のタグではなく、「JavaScript」ライブラリ内から呼び出されたことが原因でしょうか?

私は何が欠けていますか?

    // The code is part of an object's method (prototype)
    // code resides in a library "Mylib.js"

    $.ajax({
        type: 'GET',
        url: url,
        cache: false,
        async: true,
        crossdomain: true, // typo, crossDomain, see my answer below
        datatype: "jsonp", // dataType
        success: function (data, status) {
            if (status == "success" && !Object.isNullOrUndefined(data)) {  ... }

        },
        error: function (xhr, textStatus, errorThrown) {
           // access denied
        }
    });

-編集-Robotsushiのコメントに基づいて、いくつかのさらなる調査---

  1. 確かにXDomainRequest、jQueryソースコード(1.8.1)で見つけることができません
  2. cors(jQuery.support.cors = true)を設定しないと、「トランスポートなし」の例外が発生します。
  3. なぜ他の人がIE9クロスドメインリクエストで明らかに成功するのか疑問に思っています。例:jQueryクロスドメインAjaxJSONP呼び出しが一部のIEバージョンで不明な理由でランダムに失敗する
  4. jQueryがこれを処理する方法は、以下のコードの周りにあるようですが、これは私の特定のケースでは呼び出されません。理由はわかりません。

    //スクリプトタグハックトランスポートをバインドしますjQuery.ajaxTransport( "script"、function(s){

    // This transport only deals with cross domain requests
    if ( s.crossDomain ) {
    
  5. 2010年の同様の状況:Jquery $ .ajaxはクロスドメイン呼び出しでIEで失敗します。ただし、これは後のjQueryバージョンで解決されているはずです。

4

3 に答える 3

5

OK、今働いています。私の側のいくつかの間違い:

  1. それはcrossDomain: true, dataType: "jsonp"、タイプミスです-大文字を逃しました。
  2. JSONPリクエストは透過的ではありません。データは単なるJSON表記ではなく、(サーバー側で)Js関数呼び出しでラップする必要があります。http://en.wikipedia.org/wiki/JSONPを参照してください。基本的に、これは、送信されたデータを変更できない場合を意味します。 、JSONPはあなたにとって正しいオプションではありません。

すべてを考慮して、それは機能します。したがって、私の個人的なチェックリストは次のようになります。

  1. json可能であれば使用します(たとえば、Chrome、FF、またはおそらくIE10で)。応答ヘッダーが設定されていることを確認してください。Access-Control-Allow-Origin:*
  2. を使用する場合は、次をjsonp確認してください。 async: true、、jsonpおよびcrossdomain: truecachefalsejQuery.support.corsですtrue。これらは私が見つけた前提条件です。
  3. また、応答が「通常の」JSONデータではなくjsonp、関数呼び出し(関数でラップされたJSON)であることを確認してください。
于 2012-10-13T21:21:25.567 に答える
3

Google Cloud Storageに保存しているjsonにアクセスし、jQueryのajaxingを使用してアクセスしようとすると、同様の問題が発生しました。これはChromeとFirefoxで正常に機能しましたが、IE(9以下)でテストすると「アクセスが拒否されました」というメッセージが表示されていました。

私がそれを回避する方法は、明示的にjsonPを使用することでした:

  1. 私のjsonファイルを、jsonデータを保持するためのjavascript変数を持つjavascriptファイルに書き直します。

(function (o) { variableName = [json]; }(window.[nameSpace] = window.[nameSpace]|| {}));

  1. htmlファイルのタグ内にjavascriptファイルへのURLを含めます。例:

    <script type="application/javascript" src="[url to javascript file]"></script>

  2. そのvariableNameを介してデータを消費します

お役に立てれば :)

于 2014-08-15T15:30:31.107 に答える
2

IEではXDomainRequest、クロスサイトにXHRの代わりに使用する必要があります。

このプロセスを抽象化するjsライブラリであるeasyXDMを確認できます。

または、これを参照してください:

IEのjQueryスクリプトへのアクセスが拒否されました

于 2012-10-12T18:35:49.740 に答える