将多个参数/参数附加到jsonp回调函数

Jen*_*nn 2 javascript youtube jsonp

如何指定要传递给jsonp回调函数的更多参数?

例如,我正在尝试抓取youtube视频数据:

http://gdata.youtube.com/feeds/api/videos/gzDS-Kfd5XQ?v=2&alt=json-in-script&callback=youtubeFeedCallback
Run Code Online (Sandbox Code Playgroud)

将调用的javascript回调函数是youtubeFeedCallback,并且在调用时它只包含一个参数.

截至目前,功能将是这样的,

function youtubFeedCallback(response) {
...
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是传递这样的第二个参数,

function youtubeFeedCallback(response, divId) {
...
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?我试过在网上到处寻找,找不到任何东西.谢谢!

mu *_*ort 5

您无法像这样向回调函数添加参数.但是,您可以生成包装函数.JSONP回调函数只是默认命名空间中的一个函数,这意味着您只需要将具有已知名称的生成函数添加到全局window对象中.第一步是组成一个名字:

var callback_name = 'youtubeFeedCallback_' + Math.floor(Math.random() * 100000);
Run Code Online (Sandbox Code Playgroud)

在现实世界中,你想要将它包装在循环中并检查window[callback_name]尚未采取的内容; 你可以window.hasOwnProperty(callback_name)用来检查.获得名称后,您可以构建一个函数:

window[callback_name] = function(response) {
    youtubeFeedCallback(response, divId);
};
Run Code Online (Sandbox Code Playgroud)

你想要更多一点:

function jsonp_one_arg(real_callback, arg) {
    // Looping and name collision avoidance is left as an exercise
    // for the reader.
    var callback_name = 'jsonp_callback_' + Math.floor(Math.random() * 100000);
    window[callback_name] = function(response) {
        real_callback(response, arg);
        delete window[callback_name];  // Clean up after ourselves.
    };
    return callback_name;
}
Run Code Online (Sandbox Code Playgroud)

一旦你有了这样的东西,你可以打电话:

jsonp = jsonp_one_arg(youtubeFeedCallback, divId);
Run Code Online (Sandbox Code Playgroud)

然后使用值jsonp作为callbackYouTube网址中的值.

您可以构建更多这样的函数来处理更长的参数列表.或者你可以用arguments和建立一个通用的apply.