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

Мне нужно использовать API-интерфейс foursquare для поиска мест. Конечно, это кросс-домен.

У него нет никаких проблем в 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

Что мне делать?

Ответ 1

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

После того, как прошло много времени, чтобы понять, я наконец нашел это:

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

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

$.support.cors = true;

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

Ответ 2

jQuery.support.cors = true;

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

вам нужно сделать значение кросс-домена истинным

Ответ 3

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

Ответ 4

Попробуйте это решение:

fooobar.com/info/49086/...

Или просто поместите этот код в свой 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]-->