Помилка "Без транспорту" під час виклику ajax в IE


110

Мені потрібно використовувати API Fourrsquare для пошуку місць. Звичайно, це крос-домен.

У 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

Що я повинен зробити?


6
Ознайомтеся з відповідями на цю публікацію SO
mkozicki

Відповіді:


265

Я перевірив це на Windows Mobile 7.

Після багато часу, витраченого на розуміння, я нарешті знайшов це:

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

Рішення просте, просто встановіть це:

$.support.cors = true;

і міждоменні запити Ajax працюватимуть!


47
Я отримую "Помилка: Доступ заборонено" також на IE8 та IE9
Даррен Куні

1
Трохи відлякує, що прийнята відповідь насправді не вирішує проблему на IE8 або IE9.
Воррен Румак

2
У мене схоже питання. Працює в IE10, але не в IE8 або IE9
mishka

7
Я також отримав "Помилка: доступ заборонено", моя помилка полягала в тому, що я витягнув вміст HTTPS з домену HTTP. Переконайтеся, що ваш веб-сайт та ціль 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,
});

вам потрібно зробити значення міждоменного істинного


8
Яка різниця між вашою відповіддю та прийнятою, яка була розміщена задовго до вашої?
javanna

2
@javanna Додавання crossDomain: trueдо аргументу параметрів.
Кріс Марасті-Георг

8
Що таке крос-домен і чому це потрібно, щоб це було правдою?
Азіз Салех

Вам не потрібно crossDomain: true, це те, що $.support.corsробиться за замовчуванням, якщо я не помиляюся
Марк Пешек - Trilon.io

7

Ця проблема мене клопоче вже деякий час. В якості вирішення я використовую проксі-скрипти, розташовані на одному веб-сайті. Такі сценарії просто виконують не-ajax запит HTTP від ​​сервера до сервера (подумайте про згортання та WinHttp.WinHttpRequest) і передають стан і дані назад абоненту. Це працює, але, очевидно, не дуже ефективно, тому що він повинен виконувати два 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': '*'
  },
  ...
});

Веб-служба, яка відповідає на ці дзвінки, також відповідає заголовком "Access-Control-Allow-Origin: *".


4
... і все ж це перша відповідь на згадку заголовка CORS. Прийняте рішення для мене не спрацювало.
seanhodges

2
Я думаю, що це має бути скоріше у веб-конфігу служби.
Fjodr

6

Спробуйте це рішення:

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

Або просто введіть цей код у свій HTML відразу після включення jquery.

<!--[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]-->

Я виявив ту ж проблему, що виникає в Chrome (і, можливо, у браузері Android) на Android, тому, можливо, залиште умовний коментар, щоб дозволити всім браузерам використовувати цей сценарій. (Домашня сторінка проекту тут: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Дейв Берт

1
Це працювало для мене. Окрім того, щоб переконатися, що тип вмісту відповіді є "текст / звичайний"
Микола Мельников

Я додав його в Grunt після jquery і тепер він працює ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e

0

Я просто змінив версію jquery і замінив посилання CDN, і воно спрацювало! Просто зробіть це, якщо crossDomain:trueі $.support.cors= true не працює.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.