Erreur 'No Transport' avec l'appel jQuery ajax dans IE

110

J'ai besoin d'utiliser l'API foursquare pour rechercher des lieux. Bien sûr, c'est interdomaine.

Il n'a aucun problème dans Firefox mais dans Internet Explorer (7, 8, 9 que j'ai testé).

Mon code javascript ressemble à:

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

Dans Firefox, il affiche parfaitement les données reçues. Dans Internet Explorer, il se connecte à la console:

No Transport
Error
Error

Que devrais-je faire?

A chanté
la source
6
Découvrez les réponses pour ce message SO
mkozicki

Réponses:

265

J'ai testé cela sur Windows Mobile 7.

Après BEAUCOUP de temps passé à comprendre, j'ai finalement trouvé ceci:

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

La solution est simple, il suffit de définir ceci:

$.support.cors = true;

et les demandes de domaine croisé Ajax fonctionneront!

Magico
la source
47
Je reçois également `` Erreur: l'accès est refusé '' sur IE8 et IE9
Darren Cooney
1
Il est un peu décourageant que la réponse acceptée ne résout pas réellement le problème sur IE8 ou IE9.
Warren Rumak
2
J'ai un problème similaire. Fonctionne dans IE10 mais pas dans IE8 ou IE9
mishka
7
J'ai également eu "Erreur: l'accès est refusé", mon erreur était que j'ai extrait du contenu HTTPS d'un domaine HTTP. Assurez-vous que votre site Web et votre cible ajax utilisent les mêmes protocoles (HTTP OU HTTPS)
Torben
2
Je crois que c'est maintenant défini par défaut. Pour moi, la solution était un transport de demande XDR - voir cette réponse populaire: stackoverflow.com/a/10232313/217866
jackocnr
13
jQuery.support.cors = true;

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

vous devez faire en sorte que la valeur interdomaine soit vraie

amit thakur
la source
8
Quelle est la différence entre votre réponse et celle acceptée, qui a été postée un certain temps avant la vôtre?
javanna
2
@javanna L'ajout de crossDomain: trueà l'argument options.
Chris Marasti-Georg
8
Qu'est-ce que le domaine croisé et pourquoi doit-il être vrai?
Aziz Saleh
Vous n'avez pas besoin crossDomain: truede ce que $.support.corsfait par défaut si je ne me trompe pas
Mark Pieszak - Trilon.io
7

Ce problème me dérange depuis un certain temps. Pour contourner le problème, j'utilise des scripts proxy situés sur le même site. Ces scripts exécutent simplement une requête HTTP non ajax de serveur à serveur (pensez à curl et WinHttp.WinHttpRequest) et transmettent le statut et les données à l'appelant. Cela fonctionne, mais évidemment pas très efficace car il doit effectuer deux requêtes HTTP.

Dans mon cas, la solution est une combinaison de toutes les choses décrites ci-dessus plus l'en-tête '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': '*'
  },
  ...
});

Le service Web qui répond à ces appels répond également avec l'en-tête «Access-Control-Allow-Origin: *».

Alex D
la source
4
... et pourtant celle-ci est la première réponse à mentionner l'en-tête CORS. La solution acceptée n'a pas fonctionné pour moi.
seanhodges le
2
Je suppose que cela devrait plutôt être dans le web.config du service.
Fjodr
6

Essayez cette solution:

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

Ou, mettez simplement ce code dans votre HTML juste après avoir inclus 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
la source
J'ai trouvé le même problème survenant dans Chrome (et peut-être dans le navigateur Android) sur Android, alors laissez peut-être le commentaire conditionnel pour permettre à tous les navigateurs d'utiliser ce script. (La page d'accueil du projet est ici: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt
1
Cela a fonctionné pour moi. En plus de s'assurer que le type de contenu de la réponse est `` text / plain ''
Nikolay Melnikov
Je l'ai ajouté dans Grunt après jquery et maintenant cela fonctionne ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e
0

J'ai juste changé la version de jquery et remplacé le lien CDN et cela a fonctionné! Faites-le simplement si crossDomain:trueet $.support.cors= vrai ne fonctionne pas.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Sagar Kumar
la source