仪表板跨域AJAX与jquery

嘿大家,我正在为Apple的Dashboard创建一个小部件,我在尝试使用jquery的ajax函数从我的服务器获取数据时遇到了问题。 这是我的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) }) 

服务器用这个json响应:

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

但是出于某种原因,当我运行它时,小部件上的字段不会改变。 从调试开始,我了解到小部件甚至没有向服务器发出请求,因此我认为Apple有一些外部URL阻塞。 我知道这不可能是真的,因为很多小部件都打电话回家检查更新。

有没有人对什么可能是错的有任何想法?

编辑:此外,此代码在Safari中完美运行。


根据Luca的要求,这里是正在运行的PHP和Javascript代码:

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

在Dashcode中单击“ 小组件属性”,然后单击“ 允许网络访问”,确保选中该选项。 我已经建立了一些简单地拒绝工作的东西,这就是解决方案。

根据W3C规范 ,当前标准中不允许跨域Ajax请求(使用XMLHttpRequest / ActiveX对象):

此规范不包括为此规范的未来版本考虑的以下function:

  • 跨站点XMLHttpRequest;

然而,通过在页面上包含脚本标记以及一些servlets器配置,有一种通过跨域JSON执行ajax请求的技术。

jQuery支持这个 ,但不是用你的服务器响应

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

你会想回应这个:

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

myCallback必须是您在$ .getJSON()函数中传递的“callback”参数中的值。 因此,如果我使用PHP,这将工作:

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

Apple有一些外部URL阻止。

在Info.plist中,您需要将密钥AllowNetworkAccess设置为true。

 allowNetworkAccess  

您的代码在Safari中工作,因为它不受仪表板服务器的限制,并且它不符合标准,因为它允许跨站点AJAX。 FF IS标准的重要性在于它不允许跨站点ajax。

如果要创建仪表板小部件,为什么不在DashCode的代码库中使用XMLHttpRequest Setup函数。 Apple构建了这些,因此您无需安装第三方JS库。 我不确定JSON的支持,但也许从这里开始会带领你走向更好的方向。

有趣的是它在Safari中有效。 据我所知做x-domain ajax请求你需要使用jsonp dataType。

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

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

基本上你需要添加callback=? 查询字符串和jquery会自动用正确的方法替换它,例如:

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

编辑:把callback=? 位于查询字符串末尾只是为了安全。