仪表板跨域AJAX与jquery

时间:2009-02-20 15:53:53

标签: javascript jquery ajax widget dashboard

嘿大家,我正在为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)
})
}

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

根据W3C spec

,当前标准中不允许跨域Ajax请求(使用XMLHttpRequest / ActiveX对象)
  

此规范不包括   以下是正在进行的功能   考虑将来的版本   这个规范:

     
      
  • 跨站点XMLHttpRequest;
  •   

然而,有一种技术可以通过在页面上包含一个脚本标记以及一些服务器配置来执行 ajax 请求跨域JSONP

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

答案 2 :(得分:4)

  

Apple有一些外部URL阻止。

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

所以另一种解决方案是创建您自己的服务器端 Web 服务,您可以在其中控制 CORS,用户 Web 浏览器无法访问另一个站点,但是如果您将该其他站点包装在您自己的 Web 服务中(在相同的域)则不会导致问题。

答案 5 :(得分:-2)

有趣的是它在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=?位放在查询字符串的末尾只是为了安全。