动态JSONP方法

问题描述 投票:1回答:1

我想知道我使用JSONP的方法是否正确,如果不正确,我可以更改什么。

我的标准JSONP方法:

服务器

标准?jsonp =回调参数

客户

  1. 调用函数(例如:jsonp(url,回调))* 1
  2. 创建<script>标签* 2
  3. 执行脚本
  4. 删除脚本标签

代码注意:我只是在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}));
}
javascript ajax jsonp prototypejs
1个回答
3
投票

我看到的唯一问题是这部分:

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

© www.soinside.com 2019 - 2024. All rights reserved.