2012-02-06 11 views
107

Potrzebuję użyć API Foursquare do wyszukiwania miejsc. Oczywiście jest to między domenami.Błąd "Brak transportu" z wywołaniem ajax jQuery w IE

Nie ma żadnych problemów w Firefoksie, ale w Internet Explorerze (7, 8, 9 testowałem).

Mój kod javascript wygląda następująco:

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); 
     } 
    }); 
} 

w Firefoksie, to doskonale wyświetla odebrane dane. W programie Internet Explorer rejestruje na konsoli:

No Transport 
Error 
Error 

co mam zrobić?

+6

Sprawdź odpowiedzi na [ten SO post] (http://stackoverflow.com/questions/5241088/jquery-call-to-webservice-returns-no-transport-error) – mkozicki

Odpowiedz

255

Przetestowałem to na Windows Mobile 7.

Po dużo czasu spędził zrozumieć, w końcu znalazłem to:

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

Rozwiązanie jest proste, wystarczy ustawić w ten sposób:

$.support.cors = true; 

i żądania domeny krzyżowej Ajax będą działać!

+1

Pracował jak czar . Bardzo doceniane. – AndrewHenderson

+0

Perfect !! Dzięki ! –

+7

to jest magia !!! – ygaradon

12
jQuery.support.cors = true; 

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

trzeba wykonać przekrój wartość domeny do prawdziwej

+8

Jaka jest różnica między Twoją odpowiedzią a zaakceptowaną, która została wysłana dość dawno temu przed Twoją? – javanna

+2

@javanna Dodanie 'crossDomain: true' do argumentu options. –

+8

Co to jest domena krzyżowa i dlaczego musi ona być prawdziwa? –

7

Ten problem został bugging mnie przez jakiś czas. Jako obejście używam skryptów proxy znajdujących się w tej samej witrynie. Takie skrypty po prostu wykonują żądania HTTP niezwiązane z serwerem (myśl o curl i WinHttp.WinHttpRequest) i przekazują status i dane z powrotem do osoby dzwoniącej. Działa, ale oczywiście nie jest zbyt wydajny, ponieważ musi wykonać dwa żądania HTTP.

W moim przypadku rozwiązanie jest połączeniem wszystkich opisanych powyżej rzeczy oraz nagłówka "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': '*' 
    }, 
    ... 
}); 

Usługa internetowa, która odpowiada na te połączenia, odpowiada również nagłówkiem "Access-Control-Allow-Origin: *".

+1

To pytanie zostało zaakceptowane przez ponad 2 lata ... –

+4

... jednak ta jest pierwszą odpowiedzią na nagłówek CORS. Przyjęte rozwiązanie nie działa dla mnie. – seanhodges

+2

Myślę, że powinno to być raczej w web.config usługi. – Fjodr

5

Spróbuj tego rozwiązania:

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

Albo po prostu umieścić ten kod HTML bezpośrednio po tym 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

Znalazłem ten sam problem występujący w przeglądarce Chrome (i prawdopodobnie przeglądarce Androida) na Androidzie, więc być może pomiń ten komentarz warunkowy, aby umożliwić wszystkim przeglądarkom korzystanie z tego skryptu. (Strona główna projektu jest tutaj: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest) –

+1

To działało dla mnie. Oprócz upewnienia się, że typem odpowiedzi jest tekst/zwykły –

+0

dodałem go w Grunt po jquery i teraz działa (https://www.npmjs.com/package/jquery-ajax-transport-xdomainrequest) . – tobias47n9e