【问题标题】:Appending multiple parameters/arguments to a jsonp callback function将多个参数/参数附加到 jsonp 回调函数
【发布时间】:2011-09-27 03:56:25
【问题描述】:

如何指定更多参数传递给 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) {
...
}

这可以吗。我试过在网上到处找,什么都找不到。 谢谢!

【问题讨论】:

  • Youtube URL 调用是使用内联脚本标记完成的。我正在进行多个视频输入调用,并且需要传递一个 divId 以便我知道要使用哪个 div 元素来放入返回的 json 视频数据。我真的很想在调用 youtube URL 时传入 divId。

标签: javascript youtube jsonp


【解决方案1】:

创建“脚本”对象时,可以为其添加属性,并在以后使用 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);
}

【讨论】:

    【解决方案2】:

    更好的方法是像这样指定一个关联的 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];
    }
    

    【讨论】:

    • 这几乎可以工作,除非,如果有多个数组键具有相同的 videoid,我会得到正确的 divId。例如。如果 var arr = { "gfefe-eee": 'divId_1', "gfefe-eee": 'divId_2' };我不得不担心出现在不同 div 中的相同视频数据。不过,谢谢。
    【解决方案3】:

    你不能像这样向回调函数添加参数。但是,您可以生成包装函数。 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 URL 中的callback 值。

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

    【讨论】:

    • 如何在调用 YouTube URL 时传入第二个参数?我将 YouTube URL 作为内联脚本标记的 src 属性放置,因此它将在页面加载时执行,并以 jsonc 格式检索必要的视频数据。我需要第二个参数来确定我将把数据放入哪个 div 元素。谢谢!
    • @Jenn:您能使用 onload 处理程序来设置 src 属性吗?以http://gdata.youtube.com/... URL 开始页面,例如data-src 属性,然后您的onload 处理程序可以在调用jsonp_one_arg 并在设置之前修补callback 参数时将data-src 属性转移到src 属性src.
    • +1: 但是为什么要使用随机而不是简单的计数器来创建说"jsonp_1""jsonp_2"、...?
    • @6502:这样您就不必跟踪您使用过哪些。如果您想要连续计数器,您可以使用全局计数器,或者您可以循环通过window 寻找我想的空位。
    • @6502:如果您不想要全局,当然可以在jsonp_one_arg.sequence_number 属性中跟踪序列号。但是,您必须将自己限制在仅jsonp_one_arg 或使用成熟的通用 n 参数回调生成器。
    猜你喜欢
    • 2012-03-23
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2014-10-13
    • 2016-04-03
    • 1970-01-01
    相关资源
    最近更新 更多