123

以下は、 IE を除くすべてのブラウザーで機能します(IE 9 でテストしています)。

jQuery.support.cors = true;
...
        $.ajax(
            url + "messages/postMessageReadByPersonEmail",
            {
                crossDomain: true,
                data: {
                    messageId       : messageId,
                    personEmail     : personEmail
                },
                success: function() {
                    alert('marked as read');
                },
                error: function(a,b,c) {
                    alert('failed');
                },
                type: 'post'
            }
        );

を使用する別の関数がありますdataType: 'jsonp'が、この AJAX 呼び出しで返されるデータは必要ありません。私の最後の手段は、それを機能させるためだけに、JSONP でラップされたジブリッシュを返すことです。

データを返さない CORS リクエストで IE が失敗する理由はありますか?

4

12 に答える 12

150

これは、 jQueryの既知のバグです。jQuery チームは、「これをコアでサポートする計画はなく、プラグインとしてより適しています」。(このコメントを参照してください)。IE はXMLHttpRequestを使用しませんが、 XDomainRequestという名前の代替オブジェクトを使用します。

jQuery でこれをサポートするために利用できるプラグインあります

EDIT 関数$.ajaxTransportは、トランスポーター ファクトリを登録します。トランスポーターは、リクエストを実行するために内部で使用さ$.ajaxれます。したがって、通常どおり電話をかけることができるはずです。$.ajaxトランスポーターと拡張に関する情報は、ここ$.ajaxにあります。

また、このプラグインのおそらくより優れたバージョンがここにあります。

その他の 2 つの注意事項:

  1. オブジェクト XDomainRequest はIE8 から導入されたもので、それ以下のバージョンでは機能しません。
  2. IE10 から、通常の XMLHttpRequest を使用してCORS がサポートされます。

編集 2: http から https への問題

リクエストは、ホスティング ページと同じスキームをターゲットにする必要があります

この制限は、AJAX ページが http://example.comにある場合、ターゲット URL も HTTP で始まる必要があることを意味します。同様に、AJAX ページがhttps://example.comにある場合、ターゲット URL も HTTPS で始まる必要があります。

ソース: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

于 2012-04-19T16:14:42.880 に答える
62

@dennisgによって受け入れられた回答を基に、MoonScriptのjQuery.XDomainRequest.jsを使用してこれを正常に達成しまし

次のコードはChrome、Firefox、IE10では正しく機能しましたが、IE9では失敗しました。スクリプトを含めるだけで、IE9で自動的に機能するようになりました。(そしておそらく8ですが、私はそれをテストしていません。)

var displayTweets = function () {
    $.ajax({
        cache: false,
        type: 'GET',
        crossDomain: true,
        url: Site.config().apiRoot + '/Api/GetTwitterFeed',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (data) {
            for (var tweet in data) {
                displayTweet(data[tweet]);
            }
        }
    });
};
于 2013-01-22T17:01:55.153 に答える
3

問題は、IE9 以下が CORS をサポートしていないことです。XDomainRequest は、text/plainここで説明されているように、GET/POST とコンテンツ タイプのみをサポートします: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

したがって、すべての HTTP 動詞や json などを使用する場合は、別のソリューションを使用する必要があります。IE9 以下が使用されている場合にプロキシに正常にダウングレードするプロキシを作成しました。ASP.NET を使用している場合、コードを変更する必要はまったくありません。

解決策は 2 つの部分にあります。1 つ目は、jQuery ajax 処理にフックする jquery スクリプトです。crossDomain リクエストが行われ、ブラウザーが IE の場合、Web サーバーを自動的に呼び出します。

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

Web サーバーでは、リクエストを受信し、X-CorsProxy-Url http ヘッダーから値を取得し、HTTP リクエストを実行して、最終的に結果を返す必要があります。

私のブログ投稿: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

于 2014-04-24T11:07:23.193 に答える
1

サポートされているすべてのブラウザー (IE7+ および通常のブラウザー) に対する唯一のソリューションだったので、すべての要求をJSONPにしました。あなたの答えはIE9で技術的に機能するので、正しい答えが得られます。

于 2012-04-20T17:57:17.480 に答える
1

MoonScript によるソリューションに基づいて構築すると、代わりにこれを試すことができます。

https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js

利点は、これは低レベルのソリューションであるため、jQuery だけでなく、他のフレームワークを使用して IE 8/9 で CORS を (可能な範囲で) 有効にすることです。AngularJS と jQuery 1.x および 2.x で使用して成功しました。

于 2014-08-15T22:54:13.320 に答える
0

開発マシンで CORS Web サービスをテストしていたところ、IE でのみ「アクセスが拒否されました」というエラー メッセージが表示されました。Firefox と Chrome は問題なく動作しました。これは、ajax 呼び出しで localhost を使用したことが原因であることが判明しました。したがって、私のブラウザの URL は次のようなものでした。

http://my_computer.my_domain.local/CORS_Service/test.html

そして、test.html内の私のajax呼び出しは次のようなものでした:

//fails in IE 
$.ajax({
  url: "http://localhost/CORS_Service/api/Controller",
  ...
});

ローカルホストの代わりにコンピューターの IP を使用するように ajax 呼び出しを変更すると、すべてが機能しました。

//Works in IE
$.ajax({
  url: "http://192.168.0.1/CORS_Service/api/Controller",
  ...
});

IE 開発ツール ウィンドウの [ネットワーク] タブにも、CORS Preflight OPTIONS 要求とそれに続く XMLHttpRequest GET が表示されます。これはまさに私が期待していたものです。

于 2013-11-07T13:37:15.837 に答える
0

この問題を解決するには、次の名前の ajax ファイルに含まれている .js があるかどうかも確認してください。

于 2013-07-08T08:04:25.367 に答える
0

IE8/9 で CORS リクエストにjquery-transport-xdr jQuery プラグインを使用してみてください。

于 2015-10-06T17:21:03.647 に答える