Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome扩展-将消息从内容脚本发送到后台页面并返回到内容脚本?_Javascript_Jquery_Google Chrome_Google Chrome Extension - Fatal编程技术网

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

Javascript chrome扩展-将消息从内容脚本发送到后台页面并返回到内容脚本?,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,我不知道这是否是做我想做的事情的最有效的方式,如果不是,请告诉我 我正在构建一个chrome扩展,它应该循环遍历页面上的每个单词,然后将其与数组中12000个元素的列表进行比较。我设法让它在内容脚本页面上工作,但令我沮丧的是,由于所有正在发生的循环,加载我的内容脚本大约需要7秒钟。显然,这并不理想。所以我想把所有的p标记发送到后台页面,然后它将p单词与数组进行比较,一旦找出匹配的单词,它就会向内容脚本发送一条消息,其中包含一个较小的数组,数组中只包含p标记和我的数组中的单词 现在我的问题是,这可

我不知道这是否是做我想做的事情的最有效的方式,如果不是,请告诉我

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

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


最后一个问题:我的清单使用的是
html
形式的背景页面,但如果我想同时使用背景脚本,谷歌不允许这样做,那么我可以将我的背景脚本放在背景页面
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消息系统的更多信息,请阅读

特别是如果你必须发送大量的消息,请查看长寿命连接部分


对于第二个问题,您可以将清单中的background page属性替换为:

"background":
{
    "scripts":
    [
        "background.js",
        "otherScript.js",
        ....
        "theLastScript.js"
    ]
}
Chrome将自动创建包含此脚本的背景页面(按相同顺序)


注:下次你在这个网站上发帖时,请一次只问一个问题;-)

欢迎访问SO的可能副本。在你的最后一段中:所以在一个问题中处理多个问题并不好。但是:您的背景html肯定可以包含background.js。你也可以完全跳过html,Chrome会帮你做到。如果没有更多的上下文,这很难说。您的建议会增加很多开销(序列化DOM,与后台页面交换消息),如果处理选项卡中的所有标记需要7秒钟,那么将其移动到扩展的后台页面并不能改善用户体验。您最好尝试提高应用程序的性能。使用devtools的探查器找出瓶颈,并修复它。没关系,这里不是每个人都能说一口流利的英语。只是这是最令人恼火的错误之一。请参阅。@Xan Haha^^从现在起我会小心处理:-)您可以发送jQuery对象消息吗?@Teepeemm您可以发送任何类型的消息。它可以是一个对象、一个字符串、一个数组、一个整数,或者任何你想要的东西