2009-02-20 58 views
5

嘿大家好,我正在为Apple的仪表板的工具,我试图从我的服务器使用jQuery的Ajax功能获取数据时遇到了问题。这里是我的javascript代码:仪表板跨域AJAX与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) 
}) 

,并使用与此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) 
}) 
} 

回答

7

在Dashcode点击控件属性然后允许网络访问确保选项被选中。我建立了一些简单的拒绝工作的东西,这就是解决方案。

-2

有趣的是它在Safari浏览器。据我所知做x域的ajax请求,你需要使用jsonp数据类型。

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=?位在查询字符串的结尾只是为了安全起见。

4

跨域Ajax请求(使用XMLHttpRequest/ActiveX对象)在当前的标准是不允许的,按照所述W3C spec

本规范不包括 以下特征,其正在 考虑对于未来版本的 本规范:

  • 跨站点XMLHttpRequest;

但是有做AJAX请求跨域,JSONP,由包括页面上的一个脚本标签1种技术,并配有小服务器配置。

jQuery的支持this,但不是这个

{"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"});'; 
+0

我试过添加?callback =?到url的末尾,我在服务器上使用了精确的PHP代码,但仍然没有任何结果。 – 2009-02-20 20:23:28

+0

我们可以看到Javascript和PHP代码吗?也是JavaScript控制台输出任何错误? – 2009-02-20 21:29:01

+0

你走了,没有,dashcode没有报告runlog中的任何内容。 – 2009-02-22 15:41:32

0

如果要创建仪表盘控件,你为什么不使用XMLHttpRequest设置功能Dashcode中的代码库。 Apple建立了这些,所以你不需要安装第三方JS库。我不确定是否支持JSON,但也许从这里开始会让你朝着更好的方向发展。

4

Apple有某种外部URL块。

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

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

您的代码在Safari工作,因为它不是在仪表板服务器的限制,它不是标准complient的,因为它确实允许跨站点AJAX。 FF IS标准有助于它不允许跨站点ajax。