2012-06-26 45 views
2

我正在學習javascript和json,我需要從另一個服務器獲取我的json文件。我已經完成了一些使用本地json文件的javascript測試,但現在我想將所有代碼轉換爲jsonp,因爲我需要處理另一個域上的文件。 我的代碼是:從JavaScript代碼使用jsonp

function jsonEntity() 
{ 
var richiestaEntity = new XMLHttpRequest(); 

richiestaEntity.onreadystatechange = function() 
{ 
    if(richiestaEntity.readyState == 4) 
{ 
     var objectentityjson = {}; 
     window.arrayEntity= []; //creazione dell'array che conterrà le entity 
     objectentityjson = JSON.parse(richiestaEntity.responseText); 

     arrayEntita = objectentityjson.cards; 

    return arrayEntita; 
    } 
} 
richiestaEntity.open("GET", "myjson.json", true); 
richiestaEntity.send(null); 
} 

我怎樣才能不失去我的代碼的結構與工作JSONP JSON地方的呢?

+1

'JSONP'是一個使用事實的人可以執行另一個域中的腳本的事實。您只需創建一個腳本元素並設置其「src」即可。你不能用'XHR'來做。請參閱http://en.wikipedia.org/wiki/JSONP#How_it_works – Esailija

回答

4

JSONP和JSON在幕後從根本上有所不同。有關更多詳細信息,請參閱my other Stack Overflow answer

因爲JSONP是如何工作的,你需要服務器配合包裹在一個函數調用(其名稱通常由callback GET參數指定)的JSON響應;

/get_jsonp.php?callback=foo 

(應該)得到:

foo({ 
    "foo": "bar" 
}); 

...的響應。

假設你有這種合作,你可以改變你現有的功能如下;

function jsonEntity() 
{ 
    var callbackName = "ajaxCallback"; 
    var script = document.createElement("script"); 

    // This bit needs the cooperation of the server, 
    // otherwise `ajaxCallback` won't be called. 
    script.src = "myjson.json?callback=" + callbackName; 

    window[callbackName] = function (obj) { 
     window.arrayEntity = obj.cards; 
    } 

    document.body.appendChild(script); 
} 
1

JSONP與JSON的工作方式不同。

使用JSON,您基本上使用XHR從您的服務器請求文件,解析它並使用生成的對象。

使用JSONP插入<script>標記,就像從其他服務器加載lib一樣。只有一些區別:在URL中傳輸一個附加參數,回調函數,並在頁面上定義該函數。

這可能如下所示。首先我們定義我們的回調:

function myCallback(data) { 
    // do some stuff with data 
} 

那麼我們動態地插入一個新的<script>標籤檢索數據。

<script src="path.to/remote/server.js?callback=myCallback" type="text/javascript"></script> 

我們完成了。

服務器現在的形式發送

myCallback({"your": "answer", "is": "here" }); 

它調用回調函數和inits你處理的答案。請參閱此處,而不是通常的JSON響應,服務器使用作爲參數的對象(代表JSON)對您的回調函數進行函數調用。

請注意,參數名稱(在我的示例中是「回調」)可能會因服務提供商的不同而不同。因此,在使用之前查找正確的名稱。

另一件需要注意的是,這隻適用於GET請求。您可以而不是使用此技術請求POST