Javascript 向jsonp回调函数追加多个参数
如何指定更多要传递给jsonp回调函数的参数 例如,我试图抓取youtube视频数据: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
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”};我不得不担心同样的视频数据出现在不同的分区中。不过谢谢你。