Ошибка "Нет транспорта" с вызовом jQuery ajax в IE

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

Что я должен делать?

Sang
источник
6
Посмотрите ответы на этот пост SO
mkozicki

Ответы:

265

Я тестировал это на Windows Mobile 7.

После МНОГО времени, потраченного на понимание, я наконец нашел это:

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

Решение простое, просто установите это:

$.support.cors = true;

и междоменные запросы Ajax будут работать!

Magico
источник
47
Я получаю сообщение «Ошибка: доступ запрещен» также в IE8 и IE9
Даррен Куни,
1
Немного обескураживает то, что принятый ответ на самом деле не решает проблему в IE8 или IE9.
Уоррен Румак
2
У меня похожая проблема. Работает в IE10, но не в IE8 или IE9
mishka
7
Я также получил сообщение «Ошибка: доступ запрещен», моя ошибка заключалась в том, что я вытащил HTTPS-контент из HTTP-домена. Убедитесь, что ваш веб-сайт и цель ajax используют одни и те же протоколы (HTTP ИЛИ HTTPS)
Торбен,
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 02
2
@javanna Добавление crossDomain: trueк аргументу параметров.
Крис Марасти-Георг
8
Что такое кросс-домен и почему он должен быть правдой?
Азиз Салех
Вам не нужно crossDomain: true, что $.support.corsпо умолчанию, если я не ошибаюсь
Марк Пешак - Trilon.io
7

Эта проблема меня беспокоит некоторое время. В качестве обходного пути я использую прокси-скрипты, расположенные на том же сайте. Такие сценарии просто выполняют межсерверный HTTP-запрос, отличный от ajax (подумайте о curl и 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: *.

Alex D
источник
4
... и все же это первый ответ, в котором упоминается заголовок CORS. Принятое решение у меня не сработало.
seanhodges
2
Я думаю, это должно быть в файле web.config службы.
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
Это сработало для меня. В дополнение к тому, чтобы убедиться, что Content-type ответа - 'text / plain'
Николай Мельников
Я добавил его в Grunt после jquery, и теперь он работает ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e 06
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>
Сагар Кумар
источник