Błąd „Brak transportu” w wywołaniu jQuery ajax w przeglądarce IE

110

Do wyszukiwania miejsc potrzebuję interfejsu foursquare API. Oczywiście jest to międzydomenowe.

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

Mój kod javascript wygląda tak:

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 przeglądarce Firefox doskonale wyświetla otrzymane dane. W przeglądarce Internet Explorer loguje się na konsoli:

No Transport
Error
Error

Co powinienem zrobić?

Śpiewał
źródło
6
Sprawdź odpowiedzi na ten post SO
mkozicki,

Odpowiedzi:

265

Przetestowałem to na Windows Mobile 7.

Po DUŻO czasu spędzonego na zrozumieniu, w końcu znalazłem to:

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

Rozwiązanie jest proste, po prostu ustaw to:

$.support.cors = true;

a żądania między domenami Ajax będą działać!

Magico
źródło
47
Otrzymuję komunikat „Błąd: odmowa dostępu” również w IE8 i IE9
Darren Cooney
1
Trochę zniechęcające jest to, że zaakceptowana odpowiedź w rzeczywistości nie rozwiązuje problemu w IE8 lub IE9.
Warren Rumak
2
Mam podobny problem. Działa w IE10, ale nie w IE8 ani IE9
mishka
7
Otrzymałem również komunikat „Błąd: odmowa dostępu”, mój błąd polegał na tym, że pobrałem zawartość HTTPS z domeny HTTP. Upewnij się, że Twoja witryna i cel AJAX używają tych samych protokołów (HTTP LUB HTTPS)
Torben
2
Uważam, że jest to teraz ustawione domyślnie. Dla mnie rozwiązaniem był transport żądania XDR - zobacz tę popularną odpowiedź: stackoverflow.com/a/10232313/217866
jackocnr
13
jQuery.support.cors = true;

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

musisz ustawić wartość między domenami na true

amit thakur
źródło
8
Jaka jest różnica między Twoją odpowiedzią a tą zaakceptowaną, która została opublikowana jakiś czas przed Twoją?
javanna
2
@javanna Dodanie crossDomain: truedo argumentu opcji.
Chris Marasti-Georg
8
Co to jest cross-domain i dlaczego musi być prawdziwe?
Aziz Saleh
Nie musisz crossDomain: truetego $.support.corsrobić domyślnie, jeśli się nie mylę
Mark Pieszak - Trilon.io
7

Ten problem trapi mnie od jakiegoś czasu. Aby obejść ten problem, używam skryptów proxy znajdujących się w tej samej witrynie. Takie skrypty po prostu wykonują żądanie HTTP z serwera do serwera bez AJAX (pomyśl o curl i WinHttp.WinHttpRequest) i przekazują status i dane z powrotem do wywołującego. Działa, ale oczywiście niezbyt wydajne, ponieważ musi wykonać dwa żądania HTTP.

W moim przypadku rozwiązaniem jest połączenie wszystkich rzeczy opisanych powyżej z nagłówkiem „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 wezwania, również odpowiada nagłówkiem „Access-Control-Allow-Origin: *”.

Alex D.
źródło
4
... a jednak to pierwsza odpowiedź, która wspomina o nagłówku CORS. Przyjęte rozwiązanie nie zadziałało dla mnie.
seanhodges
2
Myślę, że powinno to być raczej w pliku web.config usługi.
Fjodr
6

Wypróbuj to rozwiązanie:

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

Lub po prostu umieść ten kod w swoim HTML zaraz po włączeniu 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]-->
Scott Stafford
źródło
Znalazłem ten sam problem występujący w Chrome (i prawdopodobnie w przeglądarce Android) na Androidzie, więc być może pozostaw komentarz warunkowy, aby umożliwić wszystkim przeglądarkom korzystanie z tego skryptu. (Strona domowa projektu jest tutaj: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt
1
To zadziałało dla mnie. Oprócz upewnienia się, że typ treści odpowiedzi to „tekst / zwykły”
Nikolay Melnikov
Dodałem go w Grunt po jquery i teraz działa ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e
0

Właśnie zmieniłem wersję jquery i podmieniłem łącze CDN i zadziałało! Po prostu zrób to, jeśli crossDomain:truei $.support.cors= prawda nie działa.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Sagar Kumar
źródło