2009-02-20 32 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。