Aquí hay dos páginas, test.php y testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Ahora mi problema: cuando ambos archivos están en el mismo servidor (ya sea localhost o servidor web), funciona y se llama a alert("Success")
; si está en diferentes servidores, es decir testserver.php en el servidor web y test.php en localhost, no funciona, y se ejecuta `alert("Error". Incluso si la URL dentro de ajax se cambia a http://domain.com/path/to/file/testserver.php
Utilice JSONP.
jQuery:
$.ajax({
url:"testserver.php",
dataType: 'jsonp', // Notice! JSONP <-- P (lowercase)
success:function(json){
// do stuff with json (in this case an array)
alert("Success");
},
error:function(){
alert("Error");
}
});
PHP:
<?php
$arr = array("element1","element2",array("element31","element32"));
$arr['name'] = "response";
echo $_GET['callback']."(".json_encode($arr).");";
?>
El eco puede estar mal, hace tiempo que no uso php. En cualquier caso, tienes que dar salida a callbackName('jsonString')
, fíjate en las comillas. jQuery pasará su propio nombre de callback, así que tienes que obtenerlo de los params del GET.
Y como publicó Stefan Kendall, $.getJSON() es un método abreviado, pero entonces necesitas añadir 'callback=?'
a la url como parámetro GET (sí, el valor es ?, jQuery lo sustituye por su propio método callback generado).
Tiene que echar un vistazo a la Política del mismo origen:
En informática, la política del mismo origen
es un concepto de seguridad importante para un número de lenguajes de programación del lado del navegador lenguajes de programación del lado del navegador, como JavaScript. La política política permite que los scripts que se ejecutan en páginas que se originan en el mismo sitio acceder a los métodos y propiedades de los demás propiedades sin restricciones específicas restricciones, pero impide el acceso a la mayoría de los métodos y propiedades entre páginas en diferentes sitios.
Para que pueda obtener datos, tiene que ser:
El mismo protocolo y host
Tienes que implementar JSONP para solucionarlo.
La seguridad del navegador impide hacer una llamada ajax desde una página alojada en un dominio a otra alojada en un dominio diferente; esto se llama la "política del mismo origen]1".