Chrome扩展开发中chrome.tabs.executeScript回调始终返回空对象的问题咨询
问题分析与解决方案
你遇到的这个问题其实是跨上下文数据传递时的结构化克隆限制导致的,我来给你拆解清楚:
为什么回调返回空对象?
chrome.tabs.executeScript的回调参数result,是内容脚本中最后一个表达式的返回值,但这个值需要从内容脚本的隔离上下文(属于网页环境)传递到扩展弹出页的上下文。浏览器会通过结构化克隆算法处理跨上下文的数据传递,而localStorage是特殊的Storage内置DOM对象,它无法被结构化克隆完整序列化,所以传递到扩展上下文后就变成了空对象。
修复方案
你需要在内容脚本里把localStorage转换成普通的JavaScript对象,这样就能正常传递了。修改你的content-script.js代码:
// 方案1:用Object.assign快速转换 return Object.assign({}, localStorage); // 或者方案2:手动遍历键值对(更直观,适合需要过滤数据的场景) const storageData = {}; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); storageData[key] = localStorage.getItem(key); } return storageData;
修改后,你的pop-up.js回调里的result就能拿到完整的localStorage键值对数据了。
额外提醒
- 你已经在Manifest V2的权限里配置了
<all_urls>,所以跨域访问目标页面localStorage的权限是足够的 - 注意你当前的Manifest已经配置了自动注入
content-script.js到所有页面,同时又用executeScript手动注入,可能会导致脚本重复执行,建议根据需求二选一哦
内容的提问来源于stack exchange,提问作者Karleen-Bx
相关产品推荐
相关产品推荐

