5

大家好,我正在为 Apple 的仪表板开发一个小部件,但在尝试使用 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)
})
}
4

6 回答 6

7

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

于 2009-05-19T16:59:10.637 回答
4

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

本规范不包括正在考虑用于本规范的未来版本的以下功能:

  • 跨站 XMLHttpRequest;

然而,有 1 种跨域的ajax请求技术JSONP,通过在页面上包含一个脚本标签,并带有一点服务器配置。

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

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

你会想用这个来回应:

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

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

echo $_GET["callback"].'({"message":"Hello World","version":"1.0"});';
于 2009-02-20T16:24:58.253 回答
4

Apple 设置了某种外部 URL 块。

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

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

您的代码可以在 Safari 中运行,因为它在仪表板服务器中不受限制,并且它不符合标准,因为它确实允许跨站点 AJAX。FF IS 标准兼容,因为它不允许跨站点 ajax。

于 2009-05-04T13:12:41.960 回答
0

如果您正在创建仪表板小部件,为什么不使用 DashCode 代码库中的 XMLHttpRequest 设置功能。Apple 内置了这些,因此您无需安装 3rd 方 JS 库。我不确定 JSON 支持,但也许从这里开始会引导你走向更好的方向。

于 2009-02-20T16:40:39.557 回答
0

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

于 2021-07-12T23:55:13.893 回答
-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=?为了安全起见,将位放在查询字符串的末尾。

于 2009-02-20T16:16:36.120 回答