Javascript 向jsonp回调函数追加多个参数

Javascript 向jsonp回调函数追加多个参数,javascript,youtube,jsonp,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(r

如何指定更多要传递给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) {
...
}
我想做的是通过第二个这样的论点

function youtubFeedCallback(response) {
...
}
function youtubeFeedCallback(response, divId) {
...
}
这可能吗。我试着在网上到处找,但什么也找不到。
谢谢

不能像这样向回调函数添加参数。但是,您可以生成包装器函数。JSONP回调函数只是默认名称空间中的一个函数,这意味着您只需要向全局
窗口
对象添加一个具有已知名称的生成函数。第一步是编一个名字:

var callback_name = 'youtubeFeedCallback_' + Math.floor(Math.random() * 100000);
在现实世界中,您可能希望将其包装在一个循环中,并检查
窗口[callback\u 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 URL中的
callback


您可以构建更多这样的函数来处理更长的参数列表。或者您可以使用and构建一个通用数组。

更好的方法是像这样指定一个关联的divId和videoId数组

var arr = {
    'gzDS-Kfd5XQ': 'divId_1',
    'gwWS-Gasfdw': 'divId_2'
};
在回调函数中,通过videoId获取您的divId

function youtubFeedCallback(data)
{
    var divId = arr[data.entry.media$group.yt$videoid.$t];
}
创建“脚本”对象时,可以向其添加属性,并在以后使用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);
}

在调用YouTube URL时,我如何传递第二个参数?我将YouTube URL作为内联脚本标记的src属性,这样它将在页面加载和检索必要的jsonc格式视频数据时执行。我需要第二个参数来确定我将把数据放在哪个div元素中。谢谢@Jenn:您可以使用onload处理程序来设置
src
属性吗?用
http://gdata.youtube.com/...
URL,比如说,
datasrc
attributes,然后,在设置
src
+1之前,您的onload处理程序可以在调用
jsonp_one_arg
并修补
回调
参数的同时,将
data src
属性传输到
src
属性,但为什么要使用随机而不是简单的计数器创建say
“jsonp_1”
“jsonp_2”
, ... ?@6502:这样你就不必知道你用过哪些了。如果需要连续计数器,可以使用全局计数器;如果不需要全局计数器,可以在
窗口中循环查找打开的插槽。@6502:当然可以在
jsonp_one_arg.sequence_number
属性中跟踪序列号。但是,您必须将自己限制为只使用
jsonp_one_arg
,或者使用完整的通用n参数回调生成器。Youtube URL调用是使用内联脚本标记完成的。我正在进行多个视频输入调用,需要传递一个divId,以便知道使用哪个div元素来放入返回的json视频数据。我真的希望在调用youtube URL时传入divId。这几乎可以工作,除非有多个数组键具有相同的videoid,否则我将获得正确的divId。例如如果var arr={“gfefe eee”:“divId_1”,“gfefe eee”:“divId_2”};我不得不担心同样的视频数据出现在不同的分区中。不过谢谢你。