Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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扩展WebSQL-需要背景和;内容页访问相同的数据库,但它们不';T_Javascript_Google Chrome_Google Chrome Extension_Web Sql - Fatal编程技术网

Javascript Chrome扩展WebSQL-需要背景和;内容页访问相同的数据库,但它们不';T

Javascript Chrome扩展WebSQL-需要背景和;内容页访问相同的数据库,但它们不';T,javascript,google-chrome,google-chrome-extension,web-sql,Javascript,Google Chrome,Google Chrome Extension,Web Sql,我目前正在为Chrome开发一个小的扩展。对于扩展,我需要相同的websql数据库,但根据创建它们的位置,我会得到不同的数据库 如果在内容页中创建数据库,则会为用户所在的特定页面创建数据库 如果我在后台页面创建数据库,那么我会得到扩展自己的数据库。但它对内容页是不可见的 我希望我可以从内容页访问扩展的数据库,而不必求助于笨拙的消息传递机制。有办法做到这一点吗?这是不可能的,与本地存储的方法相同。不同的脚本代表不同的上下文 不过,所有扩展脚本都可以使用后台页面。尝试在后台页面上为数据库创建代理AP

我目前正在为Chrome开发一个小的扩展。对于扩展,我需要相同的websql数据库,但根据创建它们的位置,我会得到不同的数据库

如果在内容页中创建数据库,则会为用户所在的特定页面创建数据库

如果我在后台页面创建数据库,那么我会得到扩展自己的数据库。但它对内容页是不可见的


我希望我可以从内容页访问扩展的数据库,而不必求助于笨拙的消息传递机制。有办法做到这一点吗?

这是不可能的,与
本地存储
的方法相同。不同的脚本代表不同的上下文

不过,所有扩展脚本都可以使用后台页面。尝试在后台页面上为数据库创建代理API。这应该足够简单

我会像这样实现它(内容脚本):

另一端(背景页):


上面的代码没有经过测试,只是一个草图。

不幸的是,我很确定这是不可能的。在第一个函数调用
chrome.extension.sendRequest中,您传递了一个函数(响应)作为第二个参数。我假设这是由运行时作为listerner函数
chrome.extension.onRequest.addListener(函数(request,sender,sendResponse)
的第三个参数传递的,因此它应该作为executeSql回调传递。但是您为executeSql定义了自己的内联回调,那么
函数是什么呢(回复)
是什么意思?我不知道你的意思。我已经再次检查了文档(因为这个答案很旧),我的代码似乎还可以(尽管你现在应该使用
sendmages
,因为
sendRequest
已被弃用).Content script向与DB交互的后台页面发送请求,并通过
sendResponse
返回结果。然后由
函数(response)处理结果
。请注意,我们在这里使用的是Chrome扩展API,
sendRequest
onRequest
处于不同的上下文中,这不是“标准”JS回调传递。
chrome.extension.sendRequest({
      method: 'executeSql', 
      sql: 'SELECT title, author FROM docs WHERE id=?',
      params: [10]
   },
   function(response) {
      //do stuff
   }
); 
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    console.log(request);

    if(request.method == 'executeSql' && request.sql) {
        db.readTransaction(function (t) {
            t.executeSql(request.sql, request.params, function (t, r) {
               //send result with sendResponse
            }, function (t, e) {
               //send error with sendResponse
            });
        });
    } else if(...) { //some other method etc.
    } ...
}