Chrome扩展Manifest V3中如何在background.js获取页面EntryTool对象
解决Manifest V3中获取页面EntryTool对象的方法
首先明确:background.js运行在扩展的独立后台上下文,和目标页面的上下文完全分离,所以直接在background.js里访问
window根本不是页面的window,自然拿不到EntryTool。正确做法是用内容脚本(Content Script),它会注入到目标页面的上下文,能直接访问页面的全局对象:
- 在扩展的
manifest.json里配置内容脚本,指定目标页面的匹配规则:"content_scripts": [ { "matches": ["https://目标页面域名/*"], // 替换成实际页面的URL匹配规则 "js": ["content.js"], "run_at": "document_idle" // 可选,控制注入时机 } ] - 创建
content.js文件,获取EntryTool后通过消息传递给background.js:// content.js function checkEntryTool() { // 这里的window就是页面控制台中的window if (window.EntryTool) { // 注意:不能直接传递对象(跨上下文无法直接传递非序列化数据),需转成JSON字符串或提取所需属性 chrome.runtime.sendMessage({ type: "ENTRY_TOOL_DATA", data: JSON.stringify(window.EntryTool) }); } else { // 若EntryTool是动态加载的,用定时器轮询检测 setTimeout(checkEntryTool, 500); } } checkEntryTool(); - 在background.js里监听消息,接收EntryTool数据:
// background.js chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.type === "ENTRY_TOOL_DATA") { const entryTool = JSON.parse(message.data); // 此处处理拿到的EntryTool数据 console.log(entryTool); } });
- 在扩展的
注意事项:
- 跨上下文只能传递可序列化的数据(字符串、数字、普通对象/数组等),如果EntryTool包含函数或不可序列化属性,需提取具体需要的属性传递,而非整个对象。
内容的提问来源于stack exchange,提问作者dlgudwn123
相关产品推荐
相关产品推荐

