Chrome Extension Manifest V3注入本地脚本报错:coolObject未定义求助
问题根源
Chrome扩展的**内容脚本(Content Script)**和页面自身的脚本处于完全隔离的执行上下文。你注入的mycoolscript.js运行在页面的主上下文(将coolObject挂载到页面的window对象),但contentScript.js里的onScriptLoaded函数是在内容脚本的隔离上下文执行的,这里无法直接访问页面上下文的window.coolObject,所以会报“未定义”错误。
而Tampermonkey脚本默认运行在页面主上下文(或可直接访问页面window),因此能正常调用coolObject。
解决方案
把调用coolObject的代码也注入到页面主上下文即可,以下是两种简单实现方式:
方式1:注入内联脚本执行初始化
修改contentScript.js,在mycoolscript.js加载完成后,创建一个内联脚本插入页面,让初始化代码在页面上下文运行:
function addMyCoolScript(){ var s = document.createElement('script'); s.src = chrome.runtime.getURL('mycoolscript.js'); (document.head || document.documentElement).appendChild(s); s.onload = function () { s.parentNode.removeChild(s); // 创建内联脚本,在页面上下文执行coolObject初始化 const initScript = document.createElement('script'); initScript.textContent = ` const apikey = "ABC123"; const baseUrl = "example.com"; coolObject.initialize(apikey, { baseUrl: baseUrl }); coolObject.runStartup(); coolObject.openSession(); `; (document.head || document.documentElement).appendChild(initScript); initScript.parentNode.removeChild(initScript); }; }
方式2:修改mycoolscript.js自带初始化逻辑
如果允许修改mycoolscript.js,可以在脚本末尾直接添加初始化代码,这样脚本加载完成后自动执行:
// mycoolscript.js原代码... // 末尾添加初始化逻辑 const apikey = "ABC123"; const baseUrl = "example.com"; coolObject.initialize(apikey, { baseUrl: baseUrl }); coolObject.runStartup(); coolObject.openSession();
这种方式不需要修改contentScript.js的逻辑,脚本注入后会自行完成初始化。
内容的提问来源于stack exchange,提问作者user1735894
相关产品推荐
相关产品推荐

