IEでのjQuery ajax呼び出しによる「トランスポートなし」エラー


110

会場を検索するには、foursquare APIを使用する必要があります。もちろんクロスドメインです。

Firefoxでは問題ありませんが、Internet Explorer(7、8、9はテスト済み)で問題はありません。

私のJavaScriptコードは次のようになります。

searchVenues: function(searchQuery) {
    $.ajax({
       url: 'https://api.foursquare.com/v2/venues/search',
       data: {
            sw: bound_south_west,
            ne: bound_north_east,
            query: searchQuery.query,
            oauth_token: FSQ_OAUTH_TOKEN,
            limit: 25,
            intent: 'browse',
            v: 20120206
       },
       cache: false,
       dataType: 'json',
       success: function(data) {
           displayResults(data, searchQuery.query);
       },
       error: function(xhr, status, errorThrown) {
           console.log(errorThrown+'\n'+status+'\n'+xhr.statusText);
       }
    });
}

Firefoxでは、受信したデータを完全に表示します。Internet Explorerでは、コンソールにログオンします。

No Transport
Error
Error

私は何をすべきか?


回答:


265

私はこれをWindows Mobile 7でテストしました。

理解するのに長い時間を費やした後、私は最終的にこれを見つけました:

http://bugs.jquery.com/ticket/10660

ソリューションはシンプルです。これを設定するだけです:

$.support.cors = true;

そしてAjaxクロスドメインリクエストは機能します!


47
IE8とIE9でも「エラー:アクセスが拒否されました」が表示されます
Darren Cooney

1
受け入れられた回答が実際にIE8またはIE9の問題を解決しないことは少し残念です。
Warren Rumak 2013

2
同様の問題があります。IE10では機能しますが、IE8またはIE9では機能しません
ミシュカ

7
また、「エラー:アクセスが拒否されました」というエラーが表示されました。私の間違いは、HTTPドメインからHTTPSコンテンツをプルしたことです。Webサイトとajaxターゲットが同じプロトコル(HTTPまたはHTTPSのいずれか)を使用していることを確認してください
Torben

2
これは現在デフォルトで設定されていると思います。私にとっての解決策はXDRリクエストトランスポートでした-この人気の回答をご覧ください:stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

$.ajax({
  crossDomain: true,
  url: "",
  type: "POST",
  dataType: "xml",
  data: soapMessage,
});

クロスドメイン値をtrueにする必要があります


8
あなたの回答と、かなり前に投稿された承認済みの回答の違いは何ですか?
javanna

2
@javanna crossDomain: trueオプション引数への追加。
Chris Marasti-Georg 2014

8
クロスドメインとは何ですか?なぜそれが真実である必要があるのですか?
Aziz Saleh 2014

あなたが私が間違っていない場合、デフォルトではcrossDomain: true何をする必要はありません$.support.cors
Mark Pieszak-Trilon.io

7

この問題はしばらくの間私を悩ませてきました。回避策として、同じサイトにあるプロキシスクリプトを使用します。このようなスクリプトは、サーバー間非Ajax HTTPリクエスト(curlとWinHttp.WinHttpRequestを考える)を実行し、ステータスとデータを呼び出し元に返すだけです。動作しますが、2つのHTTPリクエストを実行する必要があるため、明らかに効率的ではありません。

私の場合、解決策は上記で説明したすべての要素と 'Access-Control-Allow-Origin'ヘッダーの組み合わせです。

$.support.cors = true; // this must precede $.ajax({}) configuration

$.ajax({
  crossDomain: true, // added in jQuery 1.5
  headers: {
    'Access-Control-Allow-Origin': '*'
  },
  ...
});

これらの呼び出しに応答するWebサービスも「Access-Control-Allow-Origin:*」ヘッダーで応答します。


4
...そして、これはCORSヘッダーについて言及する最初の回答です。受け入れられた解決策は私にとってはうまくいきませんでした。
seanhodges 2015年

2
これはむしろサービスのweb.configにあるべきだと思います。
Fjodr 2015

6

この解決策を試してください:

https://stackoverflow.com/a/14463975/237091

または、jqueryを組み込んだ直後に、このコードをHTMLに挿入するだけです。

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->

同じ問題がAndroidのChrome(およびおそらくAndroidブラウザー)でも発生しているので、条件付きコメントを省略して、すべてのブラウザーがこのスクリプトを使用できるようにします。(プロジェクトのホームページはこちらです:github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
Dave Burt

1
これでうまくいきました。Response Content-typeが 'text / plain'であることを確認することに加えて
Nikolay Melnikov

私はそれをjqueryの後にGruntに追加しましたが、機能します(npmjs.com/package/jquery-ajax-transport-xdomainrequest)。
tobias47n9e 2016

0

私はjqueryのバージョンを変更し、CDNリンクを置き換えただけでうまくいきました!crossDomain:trueand $.support.cors= trueが機能しない場合にのみ実行してください。

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.