Chrome扩展注入content script报getURL不是函数错误
问题原因
你遇到的Uncaught TypeError: chrome.extension.getURL is not a function报错由两个核心问题导致:
- API版本不兼容:
chrome.extension.getURL在Chrome Manifest V3规范中已被完全移除,从Chrome 58版本开始该API就被标记为废弃,官方替换为chrome.runtime.getURL方法。 - 资源权限未配置:就算替换了正确的API,如果你没有在扩展清单文件中声明要注入到页面上下文的脚本为可访问资源,Chrome会直接拦截该脚本的加载请求,返回404或者权限错误。
额外注意:你通过创建script标签插入到页面的脚本运行在页面主世界,这部分脚本是无法调用任何chrome.*开头的扩展API的——不过你要访问页面全局的ytplayer对象,必须把逻辑放在主世界脚本里,这个注入思路本身是对的。
修复方案
按以下步骤逐一修改即可:
- 替换loader.js中的废弃API,修改后完整代码:
const s = document.createElement("script"); s.src = chrome.runtime.getURL("src/content_script.js"); s.onload = function () { this.remove(); }; // 兼容head还未生成的早期注入时机 (document.head || document.documentElement).appendChild(s);
- 补充manifest.json的资源权限配置,根据你用的清单版本选对应写法:
- 如果你使用当前官方强制要求的Manifest V3,添加如下配置片段:
{ "manifest_version": 3, "name": "Youtube 学习扩展", "version": "0.1", "content_scripts": [ { "matches": ["*://*.youtube.com/*"], "js": ["loader.js"], "run_at": "document_start" } ], "web_accessible_resources": [ { "resources": ["src/content_script.js"], "matches": ["*://*.youtube.com/*"] } ] }- 如果你还在使用已停止支持的Manifest V2,添加如下配置:
{ "manifest_version": 2, // 其余原有配置保持不变 "web_accessible_resources": ["src/content_script.js"] } - 优化content_script.js的执行时机,避免ytplayer未初始化导致的二次报错。你当前的脚本如果在页面对象加载完成前运行,会触发
ytplayer is not defined错误,修改后代码参考:
function fetchFormats() { if (window.ytplayer?.config?.args?.raw_player_response?.streamingData) { const formats = ytplayer.config.args.raw_player_response.streamingData.formats; console.log("YT extension loaded!", formats); return true; } return false; } // 首次尝试获取 if (!fetchFormats()) { // 轮询等待ytplayer初始化完成 const checkTimer = setInterval(() => { if (fetchFormats()) clearInterval(checkTimer); }, 100); }
所有修改完成后,打开chrome://extensions/页面,点击对应扩展卡片上的刷新按钮,重新加载YouTube页面即可正常运行,不会再出现getURL相关的报错。
内容的提问来源于stack exchange,提问作者DNNikolov
相关产品推荐
相关产品推荐

