【问题标题】:Content script from Firefox add-on doesn't write to IndexedDB来自 Firefox 插件的内容脚本不会写入 IndexedDB
【发布时间】:2016-06-02 03:42:25
【问题描述】:

我正在开发 Firefox 插件,它有一些内容脚本可以将数据保存到 IndexedDB。相同的代码在 Chrome 扩展程序中工作得很好,但在 Firefox 扩展程序中却不行。在 Firefox 上,一切正常,直到必须将数据写入数据库的部分。

index.js

var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
var { indexedDB } = require('sdk/indexed-db');

var request = indexedDB.open("myDatabase");

request.onerror = function(event) {
    console.log("Failure.");
};

request.onsuccess = function(event) {
    console.log("Success.");
};

pageMod.PageMod({
    include: "*",
    contentScriptWhen: "start",
        //contentScriptFile: ["./js/jquery.min.js", "./js/jquery-ui.min.js", "./js/Dexie.min.js", "./js/content-script.js"]
    contentScriptFile: [data.url("js/jquery.min.js"), data.url("js/content-script.js"), data.url("js/jquery-ui.min.js"), data.url("js/Dexie.min.js")],
    contentStyleFile: [data.url("css/jquery-ui.min.css")]
});

content-script.js // 在 Firefox 中不起作用的部分

function transition(location, time, date) {

    var db = new Dexie("myDatabase");
    db.version(1).stores({
        likes: 'url, date, time' 
    });

    db.open();

    db.likes.add({url: location, date: date, time: time}).then (function(){

        alert("Informations are added.");

    }).catch( function(error) {
        alert("There's an error: " + error);
    });

}

我也签入了 Storage Inspector,没有任何内容添加到数据库中。更多细节:我认为这个问题可能是由脚本加载引起的,因为我在 content-script.js 的开头定义了在 DOM 准备好时加载所有内容(也许,但我不确定是否是由这个引起的,我试过“ contentScriptWhen 参数中的 start" 、 "ready" 和 "end")。

document.addEventListener("DOMContentLoaded", function(event) {

content-script.js 中的所有内容都在此事件侦听器中。

【问题讨论】:

  • 您在开发者工具控制台中是否遇到任何错误?你是在使用 JPM 扩展,还是在 firefox 中使用 WebExtensions?
  • @JaromandaX 不,这也很奇怪,我在控制台中没有收到任何与此相关的错误。我正在使用 JPM。

标签: javascript firefox firefox-addon indexeddb dexie


【解决方案1】:

Dexie 默认使用 window 或 self 的 indexedDB。在 Firefox 插件中没有在窗口中运行,所以 Dexie 可能找不到它。在 Dexie v1.3.6 中,可以在构造函数中提供 indexedDB API。

尝试最新的 Dexie v1.3.6 并执行以下操作:

var idb = require('sdk/indexed-db');
var db = new Dexie("myDatabase", {
    indexedDB: idb.indexedDB,
    IDBKeyRange: idb.IDBKeyRange
});

【讨论】:

  • 感谢您的回答。它仍然不起作用,但至少当我尝试添加/获取数据时,我终于得到了一个错误:MissingAPIError: indexedDB API not found. If using IE10+, make sure to run your code on a server URL (not locally). If using Safari, make sure to include indexedDB polyfill.我现在真的很困惑,它应该在 FF 47 上工作......
  • 您确定您使用的是 Dexie v1.3.6 并且您正确拼写 indexedDB,包括 lowers 和 uppers?
  • 是的,我已经从 GitHub 下载了最新版本的 Dexie,并检查了整个代码两次。只是为了确定 - 第一行转到 index.js 和部分 db 变量转到我的 content script?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多