我想知道我使用JSONP的方法是否正确,如果不正确,我可以更改什么。
我的标准JSONP方法:
服务器
标准?jsonp =回调参数
客户
<script>
标签* 2代码注意:我只是在stackoverflow编辑器中编写了所有这些代码,未经测试的代码1:
jsonp("http://example.com/sampleAPI", function(result) {
// Do something
});
2:
var callbackID = 0;
var jsonp = function(url, callback) {
var callbackName = 'callback' + callbackID;
// put the callback in the URL
callbackID++;
if (url.indexOf('?') != -1) {
url += '&jsonp=' + callbackName;
} else {
url += '?jsonp=' + callbackName;
}
// create the callback
window[callbackName] = function(result) {
$('jsonpScriptElement' + callbackID).remove();
callback(result);
window.splice(callbackName);
}
// Create the actual element (do this as the last thing because of caching)
// Assuming prototype.js usage
$$('body')[0].insert(new Element('script', {'href': url, 'id': 'jsonpScriptElement' + callbackID}));
}
我看到的唯一问题是这部分:
window[callbackName] = function(result) {
$('jsonpScriptElement' + callbackID).remove();
callback(result);
window.splice(callbackName);
}
您正在为每次通话创建新功能。尝试通过创建仍可以安全使用的通用函数来避免这种情况。应该不难提出一些建议。例如,您可以将序列号传递给JSONp调用,然后传递回回调,以便可以将不同的请求分开。
是的,JSONp真的很简单:P
另外,您可以将JSONp函数更改为此:
var jsonp = (function() {
var callbackID = 0;
return function (url, callback) {
//.. function body ..
}
}());
因此您不必在全局范围内声明callbackID