Chrome扩展出现Uncaught SyntaxError错误,求解决方案
问题分析与解决方案
错误原因
报错Uncaught SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON的核心原因有两点:
- 代码中存在将HTML响应当作JSON解析的操作(比如用
JSON.parse()处理了返回网页内容的请求结果)。 - 配置冲突:你在
manifest.json里把popup.js同时设置为content script(注入到YouTube页面)和popup页面的脚本,两个运行环境逻辑不兼容。popup.js是为popup页面编写的DOM操作或API调用代码,放到content script环境中执行时,可能误请求了HTML页面而非JSON接口,或者代码逻辑本身不适应content script环境,最终触发解析错误。
解决方案
1. 拆分脚本,分离运行环境
把popup页面的脚本和content script脚本彻底分开:
- 若需要向YouTube页面注入脚本,新建
content.js文件,专门编写content script逻辑。 - 修改
manifest.json的content_scripts配置,指定正确的脚本文件:
{ "manifest_version": 3, "name": "Volume", "description": "this show the v", "version": "1.0", "host_permissions": [ "https://www.googleapis.com/*" ], "content_scripts": [ { "matches": ["https://www.youtube.com/*"], "js": ["content.js"] // 替换为专用的content脚本 } ], "action": { "default_popup": "popup.html" } }
- 若你的扩展不需要向YouTube页面注入任何脚本,直接删除整个
content_scripts配置块即可,这是最直接解决冲突的方式。
2. 检查并修正网络请求逻辑
打开popup.js,排查所有涉及数据解析的代码:
- 确认
fetch或Chrome API调用的目标是返回JSON的接口(比如https://www.googleapis.com/下的API端点),而非普通HTML页面。 - 若请求后直接用
JSON.parse()处理响应,先打印响应内容确认格式:
fetch('你的API地址') .then(res => { console.log('响应内容:', res); // 先确认返回的是JSON而非HTML return res.json(); }) .then(data => { // 处理数据 }) .catch(err => console.error('请求错误:', err));
3. 确保脚本加载环境正确
popup.js仅通过popup.html中的<script src="popup.js"></script>加载,不要在其他环境(比如content script)中重复加载该脚本,避免逻辑混乱。
内容的提问来源于stack exchange,提问作者Roger Efrain
相关产品推荐
相关产品推荐

