Error 'sin transporte' con llamada jQuery ajax en IE


110

Necesito usar la API de foursquare para buscar lugares. Por supuesto, es de dominio cruzado.

No tiene ningún problema en Firefox pero sí en Internet Explorer (7, 8, 9 he probado).

Mi código javascript se ve así:

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

En Firefox, muestra perfectamente los datos recibidos. En Internet Explorer, inicia sesión en la consola:

No Transport
Error
Error

¿Qué tengo que hacer?


6
Vea las respuestas para esta publicación SO
mkozicki

Respuestas:


265

Probé esto en Windows Mobile 7.

Después de MUCHO tiempo para entender, finalmente encontré esto:

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

La solución es simple, solo configure esto:

$.support.cors = true;

y las solicitudes de dominio cruzado de Ajax funcionarán.


47
Recibo 'Error: Acceso denegado' también en IE8 e IE9
Darren Cooney

1
Es un poco desalentador que la respuesta aceptada no resuelva el problema en IE8 o IE9.
Warren Rumak

2
Tengo un problema similar. Funciona en IE10 pero no en IE8 o IE9
mishka

7
También recibí "Error: acceso denegado", mi error fue que extraje contenido HTTPS de un dominio HTTP. Asegúrese de que su sitio web y su destino ajax utilicen los mismos protocolos (HTTP O HTTPS)
Torben

2
Creo que ahora está configurado de forma predeterminada. Para mí, la solución fue un transporte de solicitud XDR; consulte esta respuesta popular: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

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

necesita hacer que el valor entre dominios sea verdadero


8
¿Cuál es la diferencia entre su respuesta y la aceptada, que se publicó bastante antes que la suya?
javanna

2
@javanna La adición de crossDomain: trueal argumento de opciones.
Chris Marasti-Georg

8
¿Qué es el dominio cruzado y por qué debe ser cierto?
Aziz Saleh

No necesitas, crossDomain: trueeso es lo que $.support.corshace por defecto si no me equivoco
Mark Pieszak - Trilon.io

7

Este problema me ha estado molestando durante algún tiempo. Como solución temporal, utilizo scripts de proxy ubicados en el mismo sitio. Dichos scripts simplemente ejecutan una solicitud HTTP no ajax de servidor a servidor (piense en curl y WinHttp.WinHttpRequest) y devuelven el estado y los datos a la persona que llama. Funciona, pero obviamente no es muy eficiente porque tiene que realizar dos solicitudes HTTP.

En mi caso, la solución es una combinación de todas las cosas descritas anteriormente más el encabezado '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': '*'
  },
  ...
});

El servicio web que responde a estas llamadas también responde con el encabezado 'Access-Control-Allow-Origin: *'.


4
... y, sin embargo, esta es la primera respuesta que menciona el encabezado CORS. La solución aceptada no funcionó para mí.
seanhodges

2
Supongo que esto debería estar en el web.config del servicio.
Fjodr

6

Prueba esta solución:

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

O simplemente coloque este código en su HTML justo después de incluir 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]-->

Encontré el mismo problema que ocurre en Chrome (y posiblemente en el navegador de Android) en Android, así que quizás deje el comentario condicional para permitir que todos los navegadores usen este script. (La página de inicio del proyecto está aquí: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt

1
Esto funcionó para mí. Además de asegurarse de que el tipo de contenido de respuesta sea 'texto / sin formato'
Nikolay Melnikov

Lo agregué en Grunt después de jquery y ahora funciona ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e

0

¡Acabo de cambiar la versión de jquery y reemplacé el enlace CDN y funcionó! Solo hazlo si crossDomain:truey $.support.cors= true no funciona.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.