You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blogger随机文章JS脚本maxResaults<5时URL为undefined问题

Blogger平台随机文章功能异常排查

问题现象

部署随机文章列表代码后,配置变量maxResaults设置为小于5的数值时,渲染出的随机文章条目链接URL为undefined;设置为大于5的数值时,功能可正常运行。

问题复现代码

JavaScript逻辑代码

var homePage = "https://blogger.googleblog.com/",
    maxResaults = 4;

function randomPosts(a) {
    if (document.getElementById("random-posts")) {
        var e = shuffleArray(a.feed.entry),
            title, link, img, content = "",
            ct = document.getElementById("random-posts");
        for (var i = 0; i < maxResaults; i++) {
            for (var j = 0; j < maxResaults; j++) {
                if (e[i].link[j].rel == "alternate") {
                    link = e[i].link[j].href;
                    break
                }
            }
            var title = e[i].title.$t;
            content += '<li class="random-posts"><a href="' + link + '" title="' + title + '" target="_blank">' + title + '</a></li>'
        }
        ct.innerHTML = content
    }
}

function shuffleArray(arr) {
    var i = arr.length,
        j, temp;
    if (i === 0) return false;
    while (--i) {
        j = Math.floor(Math.random() * (i + 1));
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp
    }
    return arr
}
var random_post = document.createElement('script');
random_post.src = homePage + '/feeds/posts/default?alt=json-in-script&orderby=published&max-results=999&callback=randomPosts';
document.getElementsByTagName('head')[0].appendChild(random_post);

HTML挂载节点

<ul id="random-posts"></ul>

根因定位

  • 内层查找文章永久链接的循环边界设置错误:代码中用j < maxResaults作为查找链接的循环终止条件,但Blogger Feed接口返回的单篇文章link数组中,标记为rel="alternate"的正文永久链接索引位置不固定,多数场景下排在数组第5位及之后。
  • 当maxResaults设置为小于5的值时,内层循环最多只会遍历当前文章link数组的前N个元素(N为设置的展示数量),无法匹配到目标链接,link变量未被赋值,最终渲染为undefined。
  • 当maxResaults设置为大于等于5的值时,循环范围刚好覆盖到目标链接的索引位置,功能表现正常属于巧合,没有从根本上解决逻辑错误。

修复方法

将内层查找链接的循环终止条件修改为遍历当前文章的全部link元素,和前端展示数量的配置完全解耦,修改后的内层循环代码如下:

// 替换原有内层for循环即可
for (var j = 0; j < e[i].link.length; j++) {
    if (e[i].link[j].rel == "alternate") {
        link = e[i].link[j].href;
        break
    }
}

可选优化:在每轮遍历文章的循环起始位置重置link变量,避免上一轮循环的链接值意外串到当前条目,可在for (var i = 0; i < maxResaults; i++) {后新增一行link = "";


内容的提问来源于stack exchange,提问作者Maro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:15:45