javascript - headers - jquery ajax manage error
Dashboard Cross-domain AJAX con jquery (5)
Hola a todos, estoy trabajando en un widget para el Tablero de Apple y me he encontrado con un problema al intentar obtener datos de mi servidor utilizando la función ajax de jquery. Aquí está mi código de JavaScript:
$.getJSON("http://example.com/getData.php?act=data",function(json) {
$("#devMessage").html(json.message)
if(json.version != version) {
$("#latestVersion").css("color","red")
}
$("#latestVersion").html(json.version)
})
Y el servidor responde con este json:
{"message":"Hello World","version":"1.0"}
Sin embargo, por alguna razón, cuando ejecuto esto, los campos en el widget no cambian. Desde la depuración, aprendí que el widget ni siquiera hace la solicitud al servidor, por lo que me hace pensar que Apple tiene algún tipo de bloque de URL externo en su lugar. Sin embargo, sé que esto no puede ser cierto, ya que muchos widgets llaman a casa para buscar actualizaciones.
¿Alguien tiene alguna idea de lo que podría estar mal?
EDITAR: Además, este código funciona perfectamente bien en Safari.
Según lo solicitado por Luca, aquí está el código PHP y Javascript que se está ejecutando en este momento:PHP:
echo $_GET["callback"].''({"message":"Hello World","version":"1.0"});'';
Javascript:
function showBack(event)
{
var front = document.getElementById("front");
var back = document.getElementById("back");
if (window.widget) {
widget.prepareForTransition("ToBack");
}
front.style.display = "none";
back.style.display = "block";
stopTime();
if (window.widget) {
setTimeout(''widget.performTransition();'', 0);
}
$.getJSON(''http://nakedsteve.com/data/the-button.php?callback=?'',function(json) {
$("#devMessage").html(json.message)
if(json.version != version) {
$("#latestVersion").css("color","red")
}
$("#latestVersion").html(json.version)
})
}
Es interesante que funcione en Safari. Por lo que sé para hacer solicitudes ajax de dominio x, necesitas usar jsonp dataType.
http://docs.jquery.com/Ajax/jQuery.getJSON
http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/
Básicamente, necesitas agregar callback=?
a su cadena de consulta y jquery lo reemplazará automáticamente con el método correcto, por ejemplo:
$.getJSON("http://example.com/getData.php?act=data&callback=?",function(){ ... });
EDITAR: poner la callback=?
mordió al final de la cadena de consulta solo para estar seguro.
Las solicitudes Ajax de dominios cruzados (utilizando el objeto XMLHttpRequest / ActiveX) no están permitidas en el estándar actual, según la especificación W3C :
Esta especificación no incluye las siguientes características que se están considerando para una versión futura de esta especificación:
- Cross-site XMLHttpRequest;
Sin embargo, hay una técnica para hacer solicitudes ajax de dominio cruzado, JSONP , al incluir una etiqueta de script en la página y con una pequeña configuración de servidor.
jQuery lo admite, pero en lugar de responder en su servidor con esto
{"message":"Hello World","version":"1.0"}
querrás responder con esto:
myCallback({"message":"Hello World","version":"1.0"});
myCallback debe ser el valor en el parámetro "devolución de llamada" que pasó en la función $ .getJSON (). Entonces, si estuviera usando PHP, esto funcionaría:
echo $_GET["callback"].''({"message":"Hello World","version":"1.0"});'';
Si está creando un widget de panel, ¿por qué no usa la función de Configuración de XMLHttpRequest en la biblioteca de códigos de DashCode? Apple los incorporó para que no necesites instalar bibliotecas JS de terceros. No estoy seguro del soporte de JSON, pero quizás comenzar aquí te guiará en una mejor dirección.
Apple tiene algún tipo de bloque de URL externo en su lugar.
En su Info.plist necesita tener la clave AllowNetworkAccess establecida en verdadero.
<key>allowNetworkAccess</key>
<true/>
Su código funciona en Safari porque no está restringido en el servidor del tablero y no cumple con los estándares, ya que permite el AJAX entre sitios. El cumplimiento de las normas FF IS es que NO permite el uso de ajax en sitios cruzados.
En Dashcode, haga clic en Atributos de widgets y, luego, en Permitir acceso a la red, asegúrese de que esa opción esté marcada. Construí algo que simplemente se negó a funcionar, y esta fue la solución.