Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 回调函数";“未定义”;_Javascript_Json_Callback_Jsonp_Tumblr - Fatal编程技术网

Javascript 回调函数";“未定义”;

Javascript 回调函数";“未定义”;,javascript,json,callback,jsonp,tumblr,Javascript,Json,Callback,Jsonp,Tumblr,我正在构建一个脚本,从Tumblr获取多个JSON提要,并基于这些数据创建HTML列表。非常简单的概念 以下是输出: 脚本在一定程度上起到了作用,因为我遇到了“回调函数未定义”的问题。只有在请求Tumblr JSON提要时选择使用回调函数时才会发生这种情况。默认情况下,如果未通过Tumblr API指定回调函数,则返回的JSON对象将分配给名为Tumblr_API_read的变量。因此JSON实际上返回: var tumblr_api_read = {the JSON object data g

我正在构建一个脚本,从Tumblr获取多个JSON提要,并基于这些数据创建HTML列表。非常简单的概念

以下是输出:

脚本在一定程度上起到了作用,因为我遇到了“回调函数未定义”的问题。只有在请求Tumblr JSON提要时选择使用回调函数时才会发生这种情况。默认情况下,如果未通过Tumblr API指定回调函数,则返回的JSON对象将分配给名为Tumblr_API_read的变量。因此JSON实际上返回:

var tumblr_api_read = {the JSON object data goes here};
如果使用回调函数,JSON数据将按如下方式返回(如预期):

如果您在此处签出脚本代码:

/*读取Tumblr*/
功能就绪(cb){
/在/.test(document.readyState)中设置超时('ready('+cb+'),9):cb();
}
函数GetTumblFeed(参数){
/*
图例:
开始-开始时的post偏移量。默认值为0。
num-要返回的帖子数。默认值为20,最大值为50。
类型-要返回的帖子类型。如果未指定或为空,则返回所有类型的帖子。必须是文本、引用、照片、链接、聊天、视频或音频中的一种。
id-要返回的特定post id。请使用而不是start、num或type。
筛选器-对文本内容运行的备用筛选器。允许的值:
文本-仅纯文本。无HTML。
无-无后期处理。准确输出作者输入的内容。(注意:某些作者使用标记,使用此选项时将不会转换为HTML。)
tagged-按相反的时间顺序返回带有此标记的帖子(最新的第一个)。可以选择指定chrono=1以按时间顺序排序(最早的第一个)。
搜索-使用此查询搜索帖子。
*/
if(params.blogurl)var blogurl=params.blogurl;
if(params.postcount)var num=params.postcount;
var jsonurl=document.location.protocol+'/'+blogurl+'/api/read/json?num='+num;
if(params.type)jsonurl+='&type='+params.type;
if(params.taged)jsonurl+='&taged='+params.taged;
if(params.search)jsonurl+='&search='+params.search;
if(params.callback)jsonurl+='&callback='+params.callback;
var jsonfeedscript=document.createElement('script');
setAttribute('charset','utf-8');
setAttribute('type','text/javascript');
setAttribute('async','true');
setAttribute('src',jsonurl);
返回jsonfeedscript;
}
函数渲染结果(设置){
var tumblrObj=(settings.callback)?settings.callback:tumblr\u api\u read;
var i=0;
var c=document.getElementById(settings.container);

对于(i;i,如果您向JSONP API提供回调,您将返回一个JavaScript片段,该片段将调用您作为参数提供的JSON数据的任何函数。正如您所指出的:

callbackFunctionName({the JSON object data goes here});
JSONP/回调系统完全取决于您的代码已经定义了
callbackFunctionName
函数,因此需要调用一些东西。其思想是,将需要处理Tumblr数据的代码放在回调函数中

如果您更喜欢使用
var-tumblr\u-api\u-read
的工作方式,只需不指定回调即可

否则,您基本上希望将当前的
jsonfeedscript.onload
移动到定义为回调的任何函数中。例如,如果您给Tumblr API一个“回调”参数“myCallback”,那么您的代码基本上应该如下所示:

function myCallback(tumblrObj) {
    // Your code that reads the JSON and inserts the HTML
}
然后,您就不需要自己调用
myCallback
。只需插入
script
标记来发出JSONP请求,Tumblr API就会返回一个脚本,该脚本调用
myCallback
,并传入JSON数据。

这行不应该是:

tumblrObj=(settings.callback)?settings.callback:tumblr\u api\u read

是:

tumblrObj=(settings.callback)?settings.callback():tumblr\u api\u read

?


我不确定,这在我看来很奇怪。

那么你是说在获取JSON数据之前,回调函数应该已经在脚本的其他地方定义好了?当然,脚本可以在没有回调的情况下工作,但是获取多个Tumblr JSON提要并将它们传递给同一个变量,这不是一种糟糕的做法吗?回调函数必须取消在您尝试进行JSONP调用之前(因为它将向您返回一个试图调用回调函数的脚本)。我同意:使用回调可能比让Tumblr API分配给特定变量更可取。即使我手动定义了回调函数(在本例中,如果我只是在脚本的根目录下编写var javascript=new Function();),JSON数据仍然没有被正确读取……您是否检查了我对这个答案的上一次编辑(特别是
myCallback
部分)?回调函数不会被JSONP回调更改、更改或创建,因此定义一个空的回调函数对您没有好处。其思想是:回调是处理数据的代码应该去的地方。您将实现放在那里,然后API调用只通过调用回调函数来提供数据在上。我发现很难将动态参数“settings.callback”转换为回调函数…(顺便说一句,非常感谢您迄今为止在清除许多内容方面的帮助)settings.callback只是一个参数集,我们在其中调用脚本(aka在index.html文件中)。我自己解决了。诀窍是在window对象上动态创建回调函数,这样您就可以使用它。虽然不是Tumblr特定的(如上面的演示),但我在这里使用这种技术:-创建动态回调函数的js在中引用-这是SoundCloud和Blip.tv嵌入的工作方式-享受:)
callbackFunctionName({the JSON object data goes here});
function myCallback(tumblrObj) {
    // Your code that reads the JSON and inserts the HTML
}