Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.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 从内容脚本同步获取存储的数据_Javascript_Jquery_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript 从内容脚本同步获取存储的数据

Javascript 从内容脚本同步获取存储的数据,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,我目前正在开发一个chrome扩展,源代码是。目标是将自定义Javascript注入网页 目前,我将每个自定义Javascript注入存储在localStorage中,并从content scipts调用它们。我已将运行时间设置为文档开始时间 我使用它从后台脚本获取存储的注入: chrome.extension.sendMessage({method:"get_injects"},function(injects){ for(index in injects){ if(/

我目前正在开发一个chrome扩展,源代码是。目标是将自定义Javascript注入网页

目前,我将每个自定义Javascript注入存储在localStorage中,并从content scipts调用它们。我已将运行时间设置为文档开始时间

我使用它从后台脚本获取存储的注入:

chrome.extension.sendMessage({method:"get_injects"},function(injects){
    for(index in injects){
        if(/^items\./.test(index)){
            itemJSON = injects[index];
            //if(window.location.host.toString().indexOf(itemJSON.url)){
            if(window.location.host.toString().match(itemJSON.url + '$')){
                var js = itemJSON.js.toString();
                eval(js);
            }
        }
    }
});
问题
我想在加载文档之前准确地运行注入脚本。但使用所提供的方法,控件将传递
chrome.extension.sendMessage
,并且不会等待得到响应
injects
。因此,
eval(js)将在页面加载的中间执行。如何解决这个问题,以便在加载页面之前能够进行注入?

在Chrome中,每个选项卡都在自己的进程中运行。背景页面在扩展过程中运行,这与您正在挂钩的选项卡不同。因此,恐怕没有真正同步的解决方案

即使使用(没有源代码限制,因此不需要背景页面)也将是异步的

但这里有一个适用于大多数页面的解决方案:

  • 如果您需要的数据位于页面的localStorage中,请转到6
  • 从页面中删除所有内容
  • 执行异步数据请求
  • 拥有数据后,将其存储在页面的本地存储中(而不是后台存储)
  • 使用相同的URL刷新页面
  • 利润
  • 有一种方法可以从后台页面到当前内容脚本同步获取任意数量的数据。您应该避免在扩展中同步阻塞代码,所以我不提供示例代码,以阻止在生产代码中复制粘贴此代码

    流程是:

  • 在内容脚本中使用synchronous
    XMLHttpRequest
    (到假URL)来启动这些步骤
  • 在后台页面中,使用事件拦截此请求
  • 同步获取数据,例如从
    localStorage
    或后台页面上的本地变量,将其转换为blob,然后使用
    var URL=URL.createObjectURL将其转换为URL(新blob(['data chunks here'])
  • 使用
    返回{redirectUrl:url}onBeforeRequest
    事件中的code>将数据发送回
  • 确保最终使用
    URL.revokeObjectURL(URL)
    释放数据使用的资源

  • 最后,尽可能避免同步、阻塞代码

    我想知道是否可以找到一种方法,将
    localSotrage
    (异步)从后台脚本设置为内容脚本。可能吗?为什么?为什么不在内容脚本中执行此操作?这样我可以防止刷新页面。唯一的问题是,重定向的
    sync xhr
    在chrome中会失败