首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态JSONP方法

动态JSONP方法
EN

Stack Overflow用户
提问于 2011-04-28 23:12:33
回答 1查看 1.4K关注 0票数 1

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

我的标准JSONP方法:

服务器

标准?jsonp=callback参数

客户端

script

  • Remove

  • 调用函数(例如: jsonp(url,回调))*1

  • 创建<script>标记*2

  • 执行脚本标记

注意:我刚刚在堆栈溢出编辑器中编写了所有这些代码,代码是未经测试的。

1:

代码语言:javascript
复制
jsonp("http://example.com/sampleAPI", function(result) {  
    // Do something  
});

2:

代码语言:javascript
复制
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}));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-28 23:21:09

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

代码语言:javascript
复制
window[callbackName] = function(result) {
    $('jsonpScriptElement' + callbackID).remove();
    callback(result);
    window.splice(callbackName);
}

你正在为你打的每一个电话做一个新的功能。尝试通过创建一个仍然可以安全地异步使用的泛型函数来避免这种情况。想出点什么应该不难。例如,您可以将序列号传递给JSONp调用,然后再传递回回调,这样就可以将不同的请求分开。

是的,JSONp真的很简单:P

此外,您还可以将JSONp函数更改为:

代码语言:javascript
复制
var jsonp = (function() {
    var callbackID = 0;
    return function (url, callback) {
         //.. function body ..
    }
}());

所以您不必在全局范围内声明callbackID

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5826101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档