仪表板跨域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=?
位于查询字符串末尾只是为了安全。