2009-02-20 11 views
5

Salut tout le monde, je travaille sur un widget pour le tableau de bord d'Apple et j'ai rencontré un problème en essayant d'obtenir des données de mon serveur en utilisant la fonction ajax de jquery. Voici mon code javascript:Tableau de bord AJAX interdomaines avec 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) 
}) 

Et le serveur répond avec cette JSON:

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

Pour une raison que, quand je lance ce champs sur le widget ne changent pas. À partir du débogage, j'ai appris que le widget ne fait même pas la demande au serveur, donc cela me fait penser qu'Apple a un type de bloc d'URL externe en place. Je sais que cela ne peut pas être vrai, car de nombreux widgets téléphonent à la maison pour vérifier les mises à jour.

Quelqu'un a-t-il une idée de ce qui pourrait être faux?

EDIT: Aussi, ce code fonctionne parfaitement bien dans Safari.


Comme demandé par Luca, voici le code PHP et Javascript qui est en cours d'exécution en ce moment:

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

Répondre

7

Dans Dashcode, cliquez sur Attributs de widget puis Autoriser l'accès réseau Assurez-vous que cette option est cochée. J'ai construit quelque chose qui a simplement refusé de travailler, et c'était la solution.

+0

Un peu en retard d'une réponse, mais ça l'a fait! –

-2

Intéressant que cela fonctionne dans Safari . Autant que je sache faire des requêtes ajax x-domain, vous devez utiliser jsonp dataType.

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

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

Fondamentalement, vous devez ajouter callback=? à votre chaîne de requête et jquery va automatiquement remplacer par la bonne méthode, par exemple:

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

EDIT: mettre le bit callback=? à la fin de la chaîne de requête juste pour être sûr.

4

inter-domaines les requêtes Ajax (Utilisation du XMLHttpRequest/objet ActiveX) ne sont pas autorisés dans la norme actuelle, selon les W3C spec:

Cette spécification ne comprend pas les caractéristiques suivantes qui sont considérés pour une future version de cette spécification:

  • Cross-site XMLHttpRequest;

Cependant, il y a 1 technique de faire ajax demandes inter-domaines, JSONP, en incluant une balise de script sur la page, et avec une petite configuration du serveur.

jQuery soutient this, mais au lieu de répondre sur votre serveur avec ce

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

vous aurez envie de répondre avec ceci:

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

MyCallBack doit être la valeur de la " callback "que vous avez passé dans la fonction $ .getJSON(). Donc, si j'utilisais PHP, cela fonctionnerait:

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

J'ai essayé d'ajouter? Callback =? à la fin de l'URL, et j'ai utilisé ce code PHP exact sur le serveur et toujours rien. –

+0

Peut-on voir le Javascript et le code PHP? La console Javascript génère-t-elle des erreurs? –

+0

Là vous allez, et non, dashcode ne rapporte rien dans le runlog. –

0

Si vous créez un widget de tableau de bord, pourquoi ne pas utiliser la fonction de configuration XMLHttpRequest dans la bibliothèque de code de DashCode. Apple les a construits pour que vous n'ayez pas besoin d'installer des bibliothèques JS tierces. Je ne suis pas sûr du support de JSON mais peut-être que commencer ici vous mènera dans une meilleure direction.

+0

Parce que les fonctions ajax de jQuery utilisent 1 ligne de code, ça a l'air mieux. –

4

Apple possède un type de bloc d'URL externe en place.

Dans votre Info.plist, la clé AllowNetworkAccess doit être définie sur true.

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

Votre code fonctionne dans Safari car il n'est pas contraint dans le tableau de bord et sever il est pas aux normes Complient en ce qu'elle ne permet cross site AJAX. Les normes FF IS sont conformes car elles ne permettent pas l'ajax inter-site.