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
相关产品推荐
相关产品推荐

