Errore "Nessun trasporto" con chiamata jQuery ajax in IE


110

Devo utilizzare l'API foursquare per cercare le sedi. Ovviamente è cross-domain.

Non ha problemi in Firefox ma in Internet Explorer (7, 8, 9 ho provato).

Il mio codice javascript ha il seguente aspetto:

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

In Firefox, mostra perfettamente i dati ricevuti. In Internet Explorer, accede alla console:

No Transport
Error
Error

Cosa dovrei fare?


6
Controlla le risposte per questo post SO
mkozicki

Risposte:


265

L'ho provato su Windows Mobile 7.

Dopo MOLTO tempo speso per capire, ho finalmente trovato questo:

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

La soluzione è semplice, basta impostare questo:

$.support.cors = true;

e le richieste interdominio Ajax funzioneranno!


47
Ricevo "Errore: accesso negato" anche su IE8 e IE9
Darren Cooney

1
È un po 'scoraggiante che la risposta accettata non risolva effettivamente il problema su IE8 o IE9.
Warren Rumak

2
Ho un problema simile. Funziona in IE10 ma non in IE8 o IE9
mishka

7
Ho anche ricevuto "Errore: accesso negato", il mio errore è stato di aver estratto il contenuto HTTPS da un dominio HTTP. Assicurati che il tuo sito web e il tuo target ajax utilizzino gli stessi protocolli (HTTP O HTTPS)
Torben

2
Credo che ora sia impostato di default. Per me la soluzione è stata una richiesta di trasporto XDR - vedere questa risposta popolare: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

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

devi rendere vero il valore interdominio


8
Qual è la differenza tra la tua risposta e quella accettata, che è stata pubblicata un po 'di tempo prima della tua?
javanna

2
@javanna L'aggiunta di crossDomain: trueall'argomento delle opzioni.
Chris Marasti-Georg

8
Cos'è il cross domain e perché deve essere vero?
Aziz Saleh

Non hai bisogno di crossDomain: truequello che $.support.corsfa di default se non sbaglio
Mark Pieszak - Trilon.io

7

Questo problema mi infastidisce da tempo. Come soluzione alternativa, utilizzo script proxy che si trovano sullo stesso sito. Tali script eseguono semplicemente una richiesta HTTP non ajax da server a server (si pensi a curl e WinHttp.WinHttpRequest) e restituiscono lo stato ei dati al chiamante. Funziona, ma ovviamente non è molto efficiente perché deve eseguire due richieste HTTP.

Nel mio caso, la soluzione è una combinazione di tutte le cose descritte sopra più l'intestazione "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': '*'
  },
  ...
});

Il servizio web che risponde a queste chiamate risponde anche con l'intestazione "Access-Control-Allow-Origin: *".


4
... eppure questa è la prima risposta a menzionare l'intestazione CORS. La soluzione accettata non ha funzionato per me.
seanhodges

2
Immagino che questo dovrebbe essere piuttosto nel web.config del servizio.
Fjodr

6

Prova questa soluzione:

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

Oppure, inserisci semplicemente questo codice nel tuo HTML subito dopo aver incluso 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]-->

Ho riscontrato lo stesso problema in Chrome (e forse nel browser Android) su Android, quindi forse tralasciare il commento condizionale per consentire a tutti i browser di utilizzare questo script. (La home page del progetto è qui: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt,

1
Questo ha funzionato per me. Oltre ad assicurarsi che il tipo di contenuto della risposta sia "text / plain"
Nikolay Melnikov

L'ho aggiunto in Grunt dopo jquery e ora funziona ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e

0

Ho appena cambiato la versione di jquery e sostituito il collegamento CDN e ha funzionato! Fallo solo se crossDomain:truee $.support.cors= true non funziona.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.