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

时间:2011-07-02 04:49:33

标签: javascript youtube jsonp

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

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

http://gdata.youtube.com/feeds/api/videos/gzDS-Kfd5XQ?v=2&alt=json-in-script&callback=youtubeFeedCallback

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

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

function youtubFeedCallback(response) {
...
}

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

function youtubeFeedCallback(response, divId) {
...
}

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

3 个答案:

答案 0 :(得分:5)

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

var callback_name = 'youtubeFeedCallback_' + Math.floor(Math.random() * 100000);

在现实世界中,你想要将它包装在一个循环中并检查window[callback_name]是否尚未被采用;您可以使用window.hasOwnProperty(callback_name)进行检查。获得名称后,您可以构建一个函数:

window[callback_name] = function(response) {
    youtubeFeedCallback(response, divId);
};

你想要更多一点:

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;
}

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

jsonp = jsonp_one_arg(youtubeFeedCallback, divId);

然后使用jsonp的值作为YouTube网址中的callback值。

您可以构建更多这样的函数来处理更长的参数列表。或者您可以使用argumentsapply构建通用目标。

答案 1 :(得分:0)

更好的方法是指定一个divIde和videoId的关联数组,如下所示

var arr = {
    'gzDS-Kfd5XQ': 'divId_1',
    'gwWS-Gasfdw': 'divId_2'
};

并在回调函数中通过videoId获取divIded

function youtubFeedCallback(data)
{
    var divId = arr[data.entry.media$group.yt$videoid.$t];
}

答案 2 :(得分:0)

创建“脚本”对象时,可以向其添加属性,并在以后使用document.currentScript对其进行引用。这对我有用,但是其他人可能需要更优雅的东西。

function blah(stuff,extraarg){
    cs=document.currentScript;
    console.log(stuff); // stuff is your json output
    console.log(cs.extraarg); // cs.extraarg is your extra arg
}

function thing(extraarg){
    var url='https://....&json_callback=blah';
    var s=document.createElement('script');
    s.src=url;
    s.extraarg=extraarg;
    document.body.appendChild(s);
}