chrome 扩展 - 将消息从内容脚本发送到后台页面并返回到内容脚本?

chrome extension - send message from content script to background page and back to content script?

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

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

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

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

对于您的第一个问题,是的,可以这样做。它将在后台(和隐藏)页面中执行大量处理。这样,带有内容脚本的页面就不会卡顿了。

你可以这样做:

在您的后台脚本中:

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 : 下次您 post 访问此站点时,请一次只问一个问题 ;-)