如何指定传递给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) {
...
}
这可能吗?我试过在网上到处寻找,找不到任何东西。 谢谢!
答案 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
值。
答案 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);
}