2011-03-12 15 views
10

Así que estoy tratando de completar la sencilla tarea de obtener datos json de google, pero este pequeño código de jquery no se ejecutará. ¿Podrías por favor ayudarme a descubrir por qué?JQuery no recibirá json?

<script src="http://code.jquery.com/jquery-latest.js"></script> 

    <script> 
    $(document).ready(function(){ 
    $.getJSON("http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false", function(jsondata) { 
      alert(jsondata.status); 
    }); 
    }); 
    </script> 

La mejor solución: añadir "? & devolución de llamada =" hasta el final de la url. ¡Muchas gracias por toda su ayuda chicos!

+8

por qué la gente no use 'console.log()' está más allá de mí ... – philwinkle

+1

no sabía que podía usar eso ... – Andrew

+0

utilícelo en lugar de 'alert()'. Dependiendo de tu navegador deberías tener una consola de depuración. Firebug en Firefox funciona muy bien, Chrome está integrado (ctrl + shift + i) – philwinkle

Respuesta

5

Se llama Same Origin Policy. En resumen: el dominio que su código está encendido, es el único dominio javascript se puede comunicar con (por defecto)

Se obtiene un error como este:

XMLHttpRequest cannot load http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false. Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin. 
+1

Bueno, muchas gracias por señalar mi problema. ¿Tienes algún conocimiento de una solución para este tipo de problema? – Andrew

+0

Puede crear un proxy local con PHP u otro lenguaje de scripting que tomará el URI como una variable y lo buscará. Luego PHP/other devuelve el resultado. – philwinkle

+1

Desea proxy esa solicitud a través de algún código del lado del servidor que se ejecuta en el mismo dominio que el javascript. Además: si controlaba el dominio al que llamaba, podría usar encabezados especiales (http://www.w3.org/TR/cors/) para permitir solicitudes entre dominios. Pero desde su google, no puede agregar los encabezados a su código. Otra posibilidad es si su API admite JSONP, que permite que la respuesta JSON esté envuelta en una devolución de llamada que llamaría a su código (http://www.ibm.com/developerworks/library/wa-aj-jsonp1/) no está seguro si eso API también lo admite, por lo que deberá verificarlo en – ctcherry

0

Asegúrese de que no se trate de un problema entre dominios. Supongo que para que jQuery pueda llamar a otras URL de dominio, debe especificar la URL en algún formato especial. No recuerdo exactamente, pero ¿tal vez el "?" (signo de interrogación) anexado al final de la URL?

12

Sí, esto es absolutamente un mismo fallo Política de Origen.

Parece que la última versión de la API de Google Maps (v3) does not support jsonp. Como resultado, si desea codificar geográficamente, vas a tener que utilizar la API de Google Maps:

<script src="http://code.jquery.com/jquery-latest.js"></script> 
<script src="http://maps.google.com/maps/api/js?sensor=false"></script> 

<script> 
    $(document).ready(function(){ 
     var loc = "1600 Amphitheatre Parkway, Mountain View, CA"; 
     var geocoder = new google.maps.Geocoder(); 
     geocoder.geocode({'address': loc }, 
      function(data, status) { console.log(data); }); 
    }); 
</script> 

Otras alternativas:

  • utilizar un servicio de 'proxy', as ctcherry pointed out, a buscar el datos para ti
  • Utilice el antiguo V2 API con JSONP, pero necesitará una clave de Maps API.
1

Tuve el mismo problema. Intentando obtener json de un servidor al que no tuve acceso (=> no JSONP).

Encontré http://benalman.com/projects/php-simple-proxy/ Agregue el proxy php a su servidor y haga la llamada ajax a este archivo.

$.ajax({ 
    type: 'GET', 
    url:'proxy.php?url=http://anyDomain.com?someid=thispage', 
    dataType: "json", 
    success: function(data){ 
     // success_fn(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // error_fn(jqXHR, textStatus, errorThrown); 
    } 
}); 

donde proxy.php (el archivo de Ben Alman) está alojado en el dominio de


Alternativa (que he encontrado para ser el segundo mejor a este): http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/