【问题标题】:Blogger Javascript with JSON error on Posts > 500Blogger Javascript 在帖子 > 500 上出现 JSON 错误
【发布时间】:2013-06-04 11:51:15
【问题描述】:

我想向我的博主显示随机帖子。

我从谷歌搜索得到了一个 javascript 并尝试了它,但随机帖子的数量不正确(应该是 10,但有时是 4,有时是 2,等等)。我试图检查发生了什么,发现 json.feed.entry [500] 抛出错误。

这是我使用的javascript

<script type="text/javascript">

function randomposts(json) {
  var randarray = new Array();
  var l=0;
  var flag;
  var numofpost=10;

  var total = parseInt(json.feed.openSearch$totalResults.$t,10);

  for(var i=0;i < numofpost;) {
    flag=0;
    randarray.length=numofpost;
    l=Math.floor(Math.random()*total);
    for(j in randarray){
      if(l==randarray[j]){
        flag=1;}
    }
    if(flag==0&&l!=0){
      randarray[i++]=l;
    }
  }
  // correct output
  // alert(randarray);

  document.write('<ul>');

  // dummy for testing 500 limit 
  //for (var x = 0; x < numofpost; x++) {
  //  randarray[x]= 495 + x;
  //}

  for(var n in randarray){
    var p=randarray[n];
    var entry=json.feed.entry[p-1];
    var posttitle = entry.title.$t;
    for(var k=0; k < entry.link.length; k++){
      if(entry.link[k].rel=='alternate'){
        document.write('<li> ' + posttitle.link(entry.link[k].href) + '</li>');

      }
    }
  }
  document.write('</ul>');
}
</script>
<script src="/feeds/posts/default?alt=json-in-script&start-index=1&max-results=1000&callback=randomposts" type="text/javascript"></script>

目前我设置了var total = 500;,以便随机仅适用于前 500 个帖子。

如何解决这个问题?

更新: 我添加了 try catch 块,错误是 TypeError: Cannot read property 'title' of undefined

更新 2: 下图是控制台的快照。 json.feed.entry 500 未定义。

【问题讨论】:

  • 你遇到了什么错误?
  • @KemalFadillah:添加到最后一节
  • 检查“entry”..wht r u 在“var entry=json.feed.entry[p-1];”行中到达那里?
  • @Rinku 错误清楚地表明它是undefined
  • @KemalFadillah:我发了 800 多个帖子,生成的随机数是正确的(低于最大值)。

标签: javascript json blogger


【解决方案1】:

所以看起来随机索引处的提要条目为空,在这种情况下添加另一个条件以确保随机索引中的每个条目都不为空。

替换:

if(flag==0&&l!=0){

与:

if(flag==0&&l!=0&&json.feed.entry[l-1]!=null){
  randarray[i++]=l;
}

希望能解决你的问题。

问候,

PP

编辑: 然后你可以调用两次 feed url,这是实现这样的快速而肮脏的方法:

<script type="text/javascript">
var a=0;
var b=0;
var entries = new Array();
function randomposts(json) {
  for (var i in json.feed.entry) {
    var entry = json.feed.entry[i];
    if (entry != null) {
        entries[b++] = entry;
    }
  }
  a++;
  if (a < 2) return;
  var randarray = new Array();
  var l=0;
  var flag;
  var numofpost=10;

  var total = entries.length;

  for(var i=0;i < numofpost;) {
    flag=0;
    randarray.length=numofpost;
    l=Math.floor(Math.random()*total);
    for(j in randarray){
      if(l==randarray[j]){
        flag=1;}
    }
    if(flag==0&&l!=0){
      randarray[i++]=l;
      //alert(l);
    }
  }
  // correct output
  // alert(randarray);

  document.write('<ul>');

  // dummy for testing 500 limit 
  //for (var x = 0; x < numofpost; x++) {
  //  randarray[x]= 495 + x;
  //}

  for(var n in randarray){
    var p=randarray[n];
    var entry=entries[p-1];
    var posttitle = entry.title.$t;
    for(var k=0; k < entry.link.length; k++){
      if(entry.link[k].rel=='alternate'){
        document.write('<li> ' + posttitle.link(entry.link[k].href) + '</li>');

      }
    }
  }
  document.write('</ul>');
}
</script>

<script src="/feeds/posts/default?alt=json-in-script&start-index=1&max-results=500&callback=randomposts" type="text/javascript"></script>
<script src="/feeds/posts/default?alt=json-in-script&start-index=501&max-results=500&callback=randomposts" type="text/javascript"></script>

【讨论】:

  • 您的更新只是一种解决方法,如果我将帖子总数设置为 500,则会得到类似的结果。
  • 使用两个提要似乎可行。你能解释一下它是如何工作的吗?有没有表现不佳?
  • 作为 Kemal Fadillah 提供的答案,google 将返回的提要数量限制为 500,但您可以通过 start-index 参数更改您想要获取的提要范围。所以脚本的作用是请求两组 500 个提要(1-500 和 501-1000)。两个请求都有一个相同的回调,即 randomposts(),它等待两个请求的响应。一旦两个响应都到达,它将被放入一个数组中,之后它与您的原始代码非常相似。我认为它的性能并没有显着降低。
【解决方案2】:

当您将 max-results 设置为 1000 时,从服务器返回的条目将被限制为 500。它仍然会返回正确的条目总数,但是,如果您访问 json.feed.openSearch$totalResults.$t,则可以看到。

Source

【讨论】:

  • 谢谢。虽然它可能是问题的根源,但它并不能解决我的问题。在放弃之前,我会先尝试解决并等待其他答案:D
  • 好吧,您可以尝试让您的函数生成一个介于 0 和 499 之间的随机数(如果它是基于 1 的,则为 1 - 500)。但是话又说回来,这基本上就是您现在正在做的解决方法。老实说,我没有看到任何其他方式。但也许这只是我的迟钝。
【解决方案3】:

我建议使用Google JavaScript Client Library - Blogger API 来检索博客的帖子。

参见以下示例:

  <script>
  function renderResults(response) {
    if (response.items) {
      for (var i = 0; i < response.items.length; i++) {
        //do whatever you want with the posts of your blog
      }      
    }
    if(response.nextPageToken) {
      var blogId = 'XXX Your blogId XXX';
      var request = gapi.client.blogger.posts.list({
        'blogId': blogId,
        'pageToken': response.nextPageToken,
        'maxResults': 100,
      });
      request.execute(renderResults);
    }
  }
  function init() {
    gapi.client.setApiKey('XXX Get your API Key from https://code.google.com/apis/console XXX');
    gapi.client.load('blogger', 'v3', function() {
        var blogId = 'XXX Your blogId XXX';
        var request = gapi.client.blogger.posts.list({
          'blogId': blogId,
          'maxResults': 100,
        });
        request.execute(renderResults);        
    });
  }
  </script>
  <script src="https://apis.google.com/js/client.js?onload=init"></script>

【讨论】:

    【解决方案4】:

    Blogger 将每个请求的最大条目数限制为 500,尽管没有记录,但显然是这样。如果您想获取所有条目,则必须通过块设置 start-index 属性重新构建您的提要块:/feeds/posts/default?start-index=501。 在这里您可以找到更多信息:http://too-clever-by-half.blogspot.ru/2011/12/blog-feed-500-post-limit-for-more-than.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多