2012-02-06 2 views
107

Мне нужно использовать API-интерфейс foursquare для поиска мест. Конечно, это кросс-домен.Ошибка «Нет транспорта» с jQuery ajax call в IE

У этого нет никаких проблем в 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 сообщение] (http://stackoverflow.com/questions/5241088/jquery-call-to-webservice-returns-no-transport-error) – mkozicki

ответ

255

Я испытал это на Windows Mobile 7.

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

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

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

$.support.cors = true; 

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

+1

Работал как шарм , Очень признателен. – AndrewHenderson

+0

Отлично !! Благодаря ! –

+7

это волшебство !!! – ygaradon

12
jQuery.support.cors = true; 

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

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

+8

В чем разница между вашим ответом и принятым, который был опубликован довольно давно перед вашим? – javanna

+2

@javanna Добавление аргумента "crossDomain: true" в аргумент options. –

+8

Что такое перекрестный домен и почему он должен быть правдой? –

7

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

+1

Этот вопрос был принят решением более 2 лет ... –

+4

... и но это первый ответ, чтобы упомянуть заголовок CORS. Принятое решение не сработало для меня. – seanhodges

+2

Я предполагаю, что это скорее должно быть в web.config службы. – Fjodr

5

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

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]--> 
+0

Я нашел ту же проблему, что и в Chrome (и, возможно, Android-браузере) на Android, поэтому, возможно, оставьте условный комментарий, чтобы позволить всем браузерам использовать этот скрипт. (Домашняя страница проекта находится здесь: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest) –

+1

Это сработало для меня. В дополнение к тому, что Content-type Response является «text/plain» –

+0

, я добавил его в Grunt после jquery и теперь он работает (https://www.npmjs.com/package/jquery-ajax-transport-xdomainrequest) , – tobias47n9e