为啥 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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?