Firefox扩展获取游戏ID列表异常:读取至8563844698后中断
问题诊断与修复方案
核心问题分析
你遇到的ID列表读取中断问题,根源在于错误地将HTML页面当作JSON解析:
- 你用
fetch请求的是HTML页面,但直接调用response.json()尝试解析成JSON格式。如果该页面中嵌入的JSON内容在8563844698之后存在语法错误(比如引号未闭合、逗号缺失),JSON解析器会直接停止,导致后续ID无法读取。 - 另外,你在内部重复声明了
var linkIDs,虽然不直接导致中断,但会造成变量作用域混淆。
修复步骤
1. 修正数据获取与解析逻辑
如果你的网站是通过HTML页面返回JSON数据,需要先获取文本内容再手动解析,同时增加错误捕获定位问题:
let linkIDs = []; fetch('你的网站数据页面') .then(response => response.text()) // 先获取文本内容,避免直接解析JSON失败 .then(text => { try { const data = JSON.parse(text); // 手动解析JSON并捕获语法错误 linkIDs = data.values; console.log("完整ID列表:", linkIDs); // 启动移除逻辑 startRemovalLoop(); } catch (parseError) { console.error("JSON解析失败:", parseError.message); // 打印出错位置附近的内容,方便排查语法问题 const errorSegment = text.slice(Math.max(0, parseError.position - 20), parseError.position + 20); console.log("出错位置附近内容:", errorSegment); } }) .catch(error => { console.error('网络请求错误:', error); });
2. 修复DOM遍历的动态集合问题
document.getElementsByClassName返回的是动态HTML集合,删除元素时会直接改变集合的长度和索引,导致遍历遗漏。需要先将其转换为静态数组:
function startRemovalLoop() { setInterval(() => { // 转换为静态数组,避免动态集合的索引错乱问题 const gameCardLinks = Array.from(document.getElementsByClassName("game-card-link")); gameCardLinks.forEach(link => { const href = link.getAttribute("href"); // 用some替代内层循环,找到匹配ID就停止检查 const shouldRemove = linkIDs.some(id => href.includes(id)); if (!shouldRemove) return; const parent = link.parentNode.parentNode; const belowParent = link.parentNode; if (parent.classList.contains("list-item") && parent.classList.contains("game-card") && parent.classList.contains("game-tile")) { belowParent.removeChild(link); console.log("移除元素:", link); } else if (belowParent.hasAttribute("data-testid") && belowParent.getAttribute("data-testid").includes("game-tile")) { belowParent.removeChild(link); console.log("移除元素:", link); } }); }, 1200); }
3. 关键排查点
- 直接访问你的网站数据页面,查看
8563844698之后的JSON内容是否存在语法错误(比如多余的逗号、未闭合的引号、格式不规范),这是导致解析中断的最可能原因。 - 改用
let/const替代var,避免变量作用域冲突。
内容的提问来源于stack exchange,提问作者Luke Code
相关产品推荐
相关产品推荐

