回調是一個函數,你'VE在您自己的代碼中定義。 jsonp服務器將用與指定的回調函數相同的函數調用來包裝其響應。
會發生什麼事是這樣的:
1)你的代碼創建JSONP請求,這將導致一個新的<script>
塊,看起來像這樣:
<script src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"></script>
2)這新的腳本被執行您的瀏覽器,導致對JSONP服務器的請求。它與
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
3迴應),因爲這要求從腳本標籤來了,這幾乎是完全一樣的,如果你想從字面上放置
<script>
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
</script>
到您的網頁。
4)現在這個新的腳本已經從遠程服務器加載,現在它將被執行,它將做的唯一的事情是一個函數調用,parseResponse()
,傳入JSON數據作爲函數調用的唯一參數。
因此,在你的代碼別的地方,你必須:
function parseResponse(data) {
alert(data.Name); // outputs 'Foo'
}
基本上,JSONP是繞過瀏覽器的同源腳本安全策略,由具有第三方服務器注入函數調用的方式直接進入你的頁面。請注意,這在設計上非常不安全。您認爲遠程服務是光榮的,並沒有惡意的意圖。沒有什麼能夠阻止一些糟糕的服務返回一些JS代碼來竊取你的銀行/臉書/任何憑據。例如...... JSONP響應可能是
internalUseOnlyFunction('deleteHarddrive');
而不是parseReponse(...)。如果遠程站點知道你的代碼的結構,它可以使用該代碼執行任意操作,因爲你已經打開了前門,允許該站點執行任何想要的操作。
可能重複[請解釋JSONP](http://stackoverflow.com/questions/2067472/please-explain-jsonp) – Jon 2012-04-17 14:27:13