Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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/6/google-chrome/4.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_Google Chrome_Google Chrome Extension_Google Chrome Devtools - Fatal编程技术网

Javascript 在Chrome扩展内容脚本中共享内存中的对象?

Javascript 在Chrome扩展内容脚本中共享内存中的对象?,javascript,google-chrome,google-chrome-extension,google-chrome-devtools,Javascript,Google Chrome,Google Chrome Extension,Google Chrome Devtools,我对JavaScript和Chrome开发都是新手,我正在尝试创建一个扩展,在某些网页中注入内容/CSS。这很简单,但关键在于,要做到这一点,需要查看本地存储中的大量数据。根据我目前所读到的,正确的方法是: 每次访问页面时直接从内容脚本从存储器读取所需数据(JSON序列化),或 在扩展后台页面中维护状态,并使用消息传递将所需数据(也是JSON序列化的)传输到内容脚本环境 但是,这两种方法中的任何一种都会非常低效,因为在每次加载页面时都会对大量数据进行不必要的序列化和反序列化 所以,我想知道:

我对JavaScript和Chrome开发都是新手,我正在尝试创建一个扩展,在某些网页中注入内容/CSS。这很简单,但关键在于,要做到这一点,需要查看本地存储中的大量数据。根据我目前所读到的,正确的方法是:

  • 每次访问页面时直接从内容脚本从存储器读取所需数据(JSON序列化),或
  • 在扩展后台页面中维护状态,并使用消息传递将所需数据(也是JSON序列化的)传输到内容脚本环境
  • 但是,这两种方法中的任何一种都会非常低效,因为在每次加载页面时都会对大量数据进行不必要的序列化和反序列化

    所以,我想知道:

    • 是否有可能在Chrome中维护一个共享内存缓存,所有标签中插入的内容脚本都可以访问

    • 如果没有,后台页面是否可以监听
      chrome.tabs.onUpdated
      事件并以某种方式修改目标DOM本身

    • 我认为这是不可能的。你似乎已经用尽了各种可能性

      2) 内容脚本是访问/修改普通选项卡DOM的唯一方法

      1-每次访问页面时,直接从内容脚本从存储器读取所需数据(JSON序列化)

      但每次加载页面时,您都必须这样做,这是您想要避免的(我猜)

      2-维护扩展后台页面中的状态,并使用消息传递将所需数据(也是JSON序列化的)传输到内容脚本环境

      让内容脚本和后台脚本交互的唯一方法是通过
      消息传递
      。实际上,您并不是在寻找替代解决方案,而是希望改进流程,避免在每次加载页面时传递消息

      为此,您可以开发一个规范。该规范说明了要从后台获取数据的URL或域,或者基于某些条件。如果您当前的URL/标签与spec only一致,则将消息传递给后台

      或者,后台也可以执行同样的操作,并仅在遵循规范的情况下发送消息。此外,加载扩展时,还可以将存储缓存到局部变量中

      用于侦听存储中的更改并相应地更新本地数据副本


      您也可以考虑使用相同的方法。

      您是否尝试过使用?不起作用,因为注入的内容脚本无法访问该方法。如果为False,
      chrome。可以直接从内容脚本访问存储。@Xan是的,您是对的。我应该更新我的话。实际上,我的意思是说,您不应该在内容脚本中缓存数据副本。您应该只通过后台脚本来完成。因为若你们想避免从chrome存储器中多次读取,那个么内容脚本就不应该从存储器中读取。但你们并不是这么写的。为什么内容脚本不能拥有自己的缓存副本,由相同的
      onChanged
      事件维护?因为当加载选项卡或在新选项卡中打开另一个URL时,缓存副本将被销毁。更好的方法应该是将其置于后台,并在页面加载时通过消息传递询问后台。True。现在,请注意,您没有回答OP的问题,这些问题在本文的下面。