2009-02-20 18 views
5

Ciao a tutti, sto lavorando a un widget per Dashboard di Apple e ho riscontrato un problema durante il tentativo di ottenere dati dal mio server utilizzando la funzione Ajax di jQuery. Ecco il mio codice JavaScript:Dashboard AJAX cross-domain 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) 
}) 

e il server risponde con questo JSON:

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

Per qualche ragione, però, quando corro questo i campi del widget di non cambiare. Dal debug, ho appreso che il widget non fa nemmeno la richiesta al server, quindi mi viene da pensare che Apple abbia una sorta di blocco di URL esterni. So che questo non può essere vero però, perché molti widget telefonici a casa per verificare la presenza di aggiornamenti.

Qualcuno ha qualche idea su cosa potrebbe essere sbagliato?

MODIFICA: Inoltre, questo codice funziona perfettamente bene in Safari.


Come richiesto da Luca, ecco il codice PHP e JavaScript che si sta svolgendo in questo 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) 
}) 
} 

risposta

7

In Dashcode clic Attributi widget poi permettere l'accesso di rete accertarsi che l'opzione sia selezionata. Ho costruito qualcosa che semplicemente si è rifiutato di funzionare, e questa era la soluzione.

+0

Un po 'in ritardo rispetto a una risposta, ma è andata così! –

-2

Interessante che funziona in Safari . Per quanto ne so fare le richieste Ajax di x-domain, devi usare jsonp dataType.

http://docs.jquery.com/Ajax/jQuery.getJSON

http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/

Fondamentalmente è necessario aggiungere callback=? alla stringa di query e jquery sostituirà automaticamente con il metodo corretto per esempio:

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

EDIT: mettere il bit callback=? a la fine della stringa di query solo per essere al sicuro.

4

tra domini richieste Ajax (utilizzando l'XMLHttpRequest/oggetto ActiveX) non sono ammessi nello standard corrente, secondo le W3C spec:

Questa specificazione non include le seguenti caratteristiche che sono in corso di considerati per una versione futura di questa specifica:

  • Cross-site XMLHttpRequest;

Tuttavia c'è 1 tecnica di fare ajax richieste cross-domain, JSONP, includendo un tag script nella pagina, e con un po 'di configurazione del server.

jQuery supporta this, ma invece di rispondere sul server con questo

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

ti consigliamo di rispondere con questo:

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

mycallback deve essere il valore del " callback "parametro passato nella funzione $ .getJSON(). Quindi, se stavo usando PHP, questo dovrebbe funzionare:

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

Ho provato ad aggiungere? Callback =? alla fine dell'URL, e ho usato quell'esatto codice PHP sul server e ancora niente. –

+0

Possiamo vedere il codice Javascript e il codice PHP? Inoltre la console di Javascript emette errori? –

+0

Là andate, e no, dashcode non sta segnalando nulla nel registro di esecuzione. –

0

Se si crea un widget dashboard, perché non si utilizza la funzione Setup XMLHttpRequest nella biblioteca di codice di DashCode. Apple li ha creati in modo da non dover installare librerie JS di terze parti. Non sono sicuro del supporto JSON, ma forse iniziare qui ti porterà in una direzione migliore.

+0

Poiché le funzioni ajax di jQuery utilizzano 1 riga di codice, quindi è meglio. –

4

Apple ha una sorta di blocco URL esterno in posizione.

Nella tua Info.plist è necessario avere l'AllowNetworkAccess chiave impostata su true.

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

tuo codice funziona in Safari, perché non è vincolato nel sever cruscotto e non è standard complient nel senso che non permetterà sito croce AJAX. La norma FF IS è conforme al fatto che NON consente l'ajax cross site.