为啥 chrome.tabs.executeScript 方法的回调结果总是返回一个空对象?
Posted
技术标签:
【中文标题】为啥 chrome.tabs.executeScript 方法的回调结果总是返回一个空对象?【英文标题】:Why the callback result of the chrome.tabs.executeScript method return always an empty object?为什么 chrome.tabs.executeScript 方法的回调结果总是返回一个空对象? 【发布时间】:2021-07-22 22:31:38 【问题描述】:我最近发现了 chrome 扩展 开发并被 runtime.excuteScript 方法卡住了,第三个参数中的回调系统地返回给我一个空对象强> ...
为简洁起见,我将省去我所有的 manifest.json(v2):
▼ 清单权限:
"permissions": [
"storage",
"cookies",
"tabs",
"background",
"activeTab",
"<all_urls>",
"*://*/*"
]
▼ 清单内容脚本:
"content_scripts": [
"matches": ["<all_urls>"],
"run_at": "document_end",
"js": ["js/content-script.js"]
]
我的目标是将 localStorage 的内容发送到我的扩展。
▼ pop-up.js:
chrome.tabs.executeScript(
null,
file: "js/content-script.js" ,
(result) =>
if(result) console.log( "???? Result of content-script:",result )
else console.log("???? No content-script, no result")
);
▼ content-script.js:
localStorage;
▼ 扩展控制台输出:
???? Result of content-script: Array(1)
▶︎ 0:
length:1
▶︎ __proto__: Array(0)
请向我解释错误,让这个夜晚变得美好!谢谢!
【问题讨论】:
localStorage 不是一个数组,所以它没有length
。您的整个 content-script.js 应该只是 localStorage
,仅此而已。
要验证实际返回的内容,最好使用弹出窗口的开发工具,可以通过在弹出窗口中右键单击并选择“检查”来打开它。在 devtools 中,您可以在回调中设置断点,这样当它触发时,您将看到真正的值。它应该是一个数组,而不是一个对象,第一个元素将是数据。如果该数据为空,则表示活动页面的 localStorage 中没有数据。
@wOxxOm 我在我的代码中对其进行了修改,但结果相同,我确定我的页面的本地存储中有数据,并且内容脚本中有一个 console.log 会返回给我存储 usbl.b947a5295d9a.c.59d7ee81a237: "F/3/T//0//", ...
如果你的代码修改了console.log之后的数据,那么输出就会出错,这就是为什么你应该使用断点来验证它的原因。或者,您可以使用 JSON.parse(JSON.stringify(result)) 来确保它被克隆。无论如何,代码是正确的,所以问题一定是问题中没有显示的其他问题。
【参考方案1】:
我从未找到解决方案。 但是我通过使用这种方法发送数据解决了这个问题:
▼ 内容脚本.js:
chrome.runtime.sendMessage('localStorage' : localStorage);
▼ pop-up.js:
chrome.runtime.onMessage.addListener((message) => message.localStorage);
【讨论】:
以上是关于为啥 chrome.tabs.executeScript 方法的回调结果总是返回一个空对象?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?