2009-02-20 21 views
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 javascript:Dashboard Dominio cruzado AJAX con jquery

$.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"} 

Por alguna razón, sin embargo, cuando ejecuto esto, los campos en el widget no cambie. De la depuración, aprendí que el widget ni siquiera hace la solicitud al servidor, por lo que creo 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.


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

Respuesta

7

En Dashcode clic Atributos widget continuación permitirá acceso de red asegúrese de que la opción está marcada. Construí algo que simplemente se negó a funcionar, y esta fue la solución.

+0

Un poco tarde de respuesta, ¡pero eso fue todo! –

-2

interesante que funciona 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 es necesario agregar callback=? a su cadena de consulta y jQuery automáticamente lo reemplazará con el método correcto por ejemplo:

$.getJSON("http://example.com/getData.php?act=data&callback=?",function(){ ... }); 

EDIT: poner el bit callback=? en el final de la cadena de consulta solo para estar seguro.

4

Cross-dominio peticiones Ajax (utilizando el XMLHttpRequest/objeto ActiveX) no están permitidos en la norma actual, según las W3C spec:

Esta especificación no incluye las siguientes características que están siendo considerados para una versión futura de esta especificación:

  • Cross-site XMLHttpRequest;

Sin embargo hay 1 técnica de hacer ajax solicitudes de dominios cruzados, JSONP, mediante la inclusión de una etiqueta de script en la página, y con un poco de configuración del servidor.

jQuery soporta this, pero en lugar de responder en su servidor con este

{"message":"Hello World","version":"1.0"} 

querrá responder con esto:

myCallback({"message":"Hello World","version":"1.0"}); 

MyCallback debe ser el valor del campo " parámetro de devolución de llamada "que pasó en la función $ .getJSON(). Así que si yo estaba usando PHP, esto funcionaría:

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});'; 
+0

intenté agregar? Callback =? hasta el final de la url, y utilicé ese código PHP exacto en el servidor y todavía nada. –

+0

¿Podemos ver el código Javascript y PHP? ¿También está la consola de Javascript produciendo algún error? –

+0

Ahí va, y no, dashcode no informa nada en el registro de ejecución. –

0

Si va a crear un widget de panel, ¿por qué no utilizar la función de configuración de XMLHttpRequest en la biblioteca de código 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.

+0

Porque las funciones de jQuery ajax usan 1 línea de código, por lo que se ve mejor. –

4

Apple tiene algún tipo de bloque de URL externo en su lugar.

En su Info.plist debe tener la clave AllowNetworkAccess establecida en verdadero.

<key>allowNetworkAccess</key> 
<true/> 

Su código funciona en Safari, ya que no se ve limitada en el tablero de instrumentos y Sever no es complient normas en que sí permite cruz sitio de AJAX. El cumplimiento de las normas de FF IS es que NO permite el uso de ajax en sitios cruzados.

Cuestiones relacionadas