【问题标题】:chrome extension - send message from content script to background page and back to content script?chrome 扩展 - 将消息从内容脚本发送到后台页面并返回到内容脚本?
【发布时间】:2015-06-26 16:42:01
【问题描述】:

我不知道这是否是做我想做的最有效的方法,如果不是一定要告诉我。

我正在构建一个 chrome 扩展,它应该遍历页面上的每个单词,然后将其与数组中 12,000 个元素的列表进行比较。我设法让它在内容脚本页面上运行,但令我沮丧的是,由于正在发生所有循环,加载我的内容脚本需要大约 7 秒。显然,这并不理想。所以我想到了将所有p 标签发送到背景页面,然后它将p 单词与数组进行比较,一旦确定了哪个匹配项,它就会向内容脚本发送一条消息,其中包含仅位于p 标签和我的数组中的单词的较小数组。

现在我的问题是,这可能吗?它会减少加载时间吗?这有效率吗?

最后一个问题:我的清单正在使用html 形式的背景页面,但如果我还想使用后台脚本 Google 不允许这样做,那么我可以将我的背景脚本放在后台页面中吗@ 987654326@ 文件,它会加载该脚本吗?

【问题讨论】:

  • 欢迎来到 SO。对于您的最后一段:SO不适用于一个多个问题。但是:你的背景 html 绝对可以包含一个 background.js。您也可以完全跳过 html,Chrome 会为您制作。
  • 如果没有更多上下文,这很难说。您的建议会增加很多开销(序列化 DOM,与后台页面交换消息),如果需要 7 秒来处理选项卡中的所有标签,则将其移动到扩展程序的后台页面并不是什么大问题在用户体验方面的改进。您最好尝试提高应用程序的性能。使用 devtools 的分析器找出瓶颈并修复它。

标签: javascript jquery google-chrome google-chrome-extension


【解决方案1】:

对于您的第一个问题,是的,可以这样做。它将在后台(和隐藏)页面中执行您的繁重处理。带有内容脚本的页面不会以这种方式冻结。

你可以这样做:

在您的后台脚本中:

function heavyStuff(request, sender, sendResponse)
{

    ...
    doSomeThing(request)
    doOtherThing()
    ...

    sendResponse(youreSmallerArray)
}

chrome.runtime.onMessage.addListener(heavyStuff)

在您的内容脚本中:

function manageResponse(smallerArray)
{
    ...
    doWhatYouWant(smallerArray)
    ...
}

arrayOfP = $("p")
chrome.runtime.sendMessage(arrayOfP, manageResponse)

所以它会做你想做的事,但你确定你在做什么吗?也许您的算法需要改进?

有关 Chrome 消息系统的更多信息,您可以阅读documentation

特别是如果您必须发送大量消息,请查找长期连接部分。


对于第二个问题,您可以将清单中的背景页面属性替换为:

"background":
{
    "scripts":
    [
        "background.js",
        "otherScript.js",
        ....
        "theLastScript.js"
    ]
}

Chrome 将自动创建一个包含此脚本的背景页面(以相同的顺序)。

PS : 下次您在本站发帖时,请一次只问一个问题 ;-)

【讨论】:

  • 你的。不是你是
  • 没关系,这里不是每个人都能说一口流利的英语。只是这是最令人恼火的错误之一。见here
  • @Xan 哈哈 ^^ 从现在开始我会小心的:-)
  • 你可以发送 jQuery 对象吗?
  • @Teepeemm 您可以发送任何类型。它可以是一个对象、一个字符串、一个数组、一个整数,或者任何你想要的东西
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多