Fehler 'Kein Transport' mit jQuery-Ajax-Aufruf im IE


110

Ich muss die foursquare API verwenden, um nach Veranstaltungsorten zu suchen. Natürlich ist es domänenübergreifend.

Es gibt keine Probleme in Firefox, aber in Internet Explorer (7, 8, 9, die ich getestet habe).

Mein Javascript-Code sieht aus wie:

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 werden empfangene Daten perfekt angezeigt. In Internet Explorer wird die Konsole angemeldet:

No Transport
Error
Error

Was soll ich machen?


6
Schauen Sie sich die Antworten für diesen SO-Beitrag an
mkozicki

Antworten:


265

Ich habe dies unter Windows Mobile 7 getestet.

Nachdem ich viel Zeit zum Verstehen aufgewendet hatte, fand ich endlich Folgendes:

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

Die Lösung ist einfach, stellen Sie einfach Folgendes ein:

$.support.cors = true;

und domänenübergreifende Ajax-Anfragen funktionieren!


47
Ich erhalte auch 'Fehler: Zugriff verweigert' auf IE8 und IE9
Darren Cooney

1
Es ist ein bisschen entmutigend, dass die akzeptierte Antwort das Problem auf IE8 oder IE9 nicht wirklich löst.
Warren Rumak

2
Ich habe ein ähnliches Problem. Funktioniert in IE10, aber nicht in IE8 oder IE9
Mischka

7
Ich habe auch "Fehler: Zugriff verweigert" erhalten. Mein Fehler war, dass ich HTTPS-Inhalte aus einer HTTP-Domäne abgerufen habe.
Torben

2
Ich glaube, das ist jetzt standardmäßig eingestellt. Für mich war die Lösung ein XDR-Anforderungstransport - siehe diese beliebte Antwort: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

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

Sie müssen den domänenübergreifenden Wert auf true setzen


8
Was ist der Unterschied zwischen Ihrer und der akzeptierten Antwort, die einige Zeit vor Ihrer veröffentlicht wurde?
Javanna

2
@javanna Das Hinzufügen crossDomain: truezum Optionsargument .
Chris Marasti-Georg

8
Was ist die domänenübergreifende und warum muss sie wahr sein?
Aziz Saleh

Sie brauchen das nicht crossDomain: true, was $.support.corsstandardmäßig funktioniert, wenn ich mich nicht irre
Mark Pieszak - Trilon.io

7

Dieses Problem nervt mich schon seit einiger Zeit. Um dieses Problem zu umgehen, verwende ich Proxy-Skripte, die sich auf derselben Site befinden. Solche Skripte führen einfach eine Nicht-Ajax-HTTP-Anforderung von Server zu Server aus (denken Sie an Curl und WinHttp.WinHttpRequest) und geben Status und Daten an den Anrufer zurück. Es funktioniert, ist aber offensichtlich nicht sehr effizient, da zwei HTTP-Anforderungen ausgeführt werden müssen.

In meinem Fall ist die Lösung eine Kombination aus allen oben beschriebenen Dingen und dem Header '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': '*'
  },
  ...
});

Der Webdienst, der diese Anrufe beantwortet, antwortet auch mit dem Header 'Access-Control-Allow-Origin: *'.


4
... und doch ist dies die erste Antwort, die den CORS-Header erwähnt. Die akzeptierte Lösung hat bei mir nicht funktioniert.
Seanhodges

2
Ich denke, dies sollte eher in der web.config des Dienstes sein.
Fjodr

6

Versuchen Sie diese Lösung:

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

Oder fügen Sie diesen Code einfach direkt nach dem Einfügen von jquery in Ihren HTML-Code ein.

<!--[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]-->

Ich habe das gleiche Problem in Chrome (und möglicherweise im Android-Browser) unter Android festgestellt. Lassen Sie daher den bedingten Kommentar weg, damit alle Browser dieses Skript verwenden können. (Die Projekthomepage ist hier: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt

1
Das hat bei mir funktioniert. Zusätzlich zur Sicherstellung, dass der Antwortinhaltstyp 'text / plain' ist
Nikolay Melnikov

Ich habe es nach jquery in Grunt hinzugefügt und jetzt funktioniert es ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e

0

Ich habe gerade die jquery-Version geändert und den CDN-Link ersetzt und es hat funktioniert! Mach es einfach, wenn crossDomain:trueund $.support.cors= wahr nicht funktioniert.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.