【问题标题】: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)) 来确保它被克隆。无论如何,代码是正确的,所以问题一定是问题中没有显示的其他问题。

标签: javascript google-chrome google-chrome-extension callback execute-script


【解决方案1】:

我从未找到解决方案。 但是我通过使用这种方法发送数据解决了这个问题:

▼ 内容脚本.js:

chrome.runtime.sendMessage({'localStorage' : localStorage});

▼ pop-up.js:

chrome.runtime.onMessage.addListener((message) => {message.localStorage});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多