你在說什麼JSONP?如果是這樣,你根本不調用回調或傳遞參數,API返回的代碼會。
例如,你的代碼:
window.myCallback = newCallbackFunction;
function newCallbackFunction(data) {
// use the data
}
(我假設這是不是在全球範圍內,因此分配給window
對象。)
...加上你的啓動代碼JSONP調用,它通常在頁面中添加一個script
元素,其中包含回調名稱的URL(上面的「myCallback」)。
他們的反應會是這樣的:
myCallback({
// data here
});
...,當它到達,將運行(因爲它是一個script
元素的內容),並調用你的函數。這是JSONP的工作原理。
如果要包括進一步參數的功能,你要做的就是有他們叫轉身打電話給你的目標函數的回調,如:
window.myCallback = function(data) {
newCallbackFunction(data, "foo", "bar");
};
function newCallbackFunction(data) {
// use the data
}
現在,當他們的代碼調用全球myCallback
,它所做的全部事情都是轉身,並用您指定的參數和撥打電話newCallbackFunction
。
這些參數不必像上面那樣是文字。下面是一個有點上下文的示例,使用closure:
// Assume the url already contains the name of the callback "myCallback"
function doJSONP(url, niftyInfo, moreNiftyInfo) {
var script;
// Set up the callback
window.myCallback = function(data) {
// Runs when the data arrives
newCallbackFunction(data, niftyInfo, moreNiftyInfo);
};
// Trigger the request
script = document.createElement('script');
script.src = url;
document.documentElement.appendChild(script);
}
理想的情況是,做JSONP當你每次自動生成回調的名稱,以便它是具體的要求(如果你有在同一時間兩個突出的請求):
// Assume the url ends with "callback=" and we append the name of the
// callback function to it
function doJSONP(url, niftyInfo, moreNiftyInfo) {
var cbname, script;
// Get a callback name
cbname = "callback_" +
new Date().getTime() +
"_" +
Math.floor(Math.random() * 10000);
// Set up the callback
window[cbname] = function(data) {
// Remove us from the window object
try {
delete window[cbname];
}
catch (e) { // Handle IE bug (throws an error when you try to delete window properties)
window[cbname] = undefined;
}
// Runs the function
newCallbackFunction(data, niftyInfo, moreNiftyInfo);
};
// Trigger the request
script = document.createElement('script');
script.src = url + encodeURIComponent(cbname);
document.documentElement.appendChild(script);
}
這是完美的!正是我在找什麼!是的,我爲每個特定的調用自動生成,只是不知道如何在觸發時將其他數據傳入回調。謝謝你的幫助! – spez86 2011-12-19 15:46:46
@ spez86 :-)很高興幫助! – 2011-12-19 15:49:23