我的插件中有一个 html 页面,我可以这样打开:
var buttons = require('sdk/ui/button/action');
var button = buttons.ActionButton({
id: "mozilla-link",
label: "Visit Mozilla",
icon: {
"16": "./icon-16.png",
"32": "./icon-32.png",
"64": "./icon-64.png"
},
onClick: handleClick
});
function handleClick(state) {
var tabs = require("sdk/tabs");
tabs.open({
url: self.data.url("panel.html"),
inBackground: false
});
}
效果符合预期,但现在我想从 sqlite 数据库加载一些数据。
我已经在模块的工作流程中使用数据库,如下所示:
var database = Services.dirsvc.get("ProfD", Ci.nsIFile);
database.append("searchEngines.sqlite");
dbConn = Services.storage.openDatabase(database);
var stmt = dbConn.createStatement("SELECT * FROM table;");
while (stmt.executeStep()) {
engines[stmt.row.exp] = {b : stmt.row.b};
}
stmt.finalize();
现在我想在我的 html 页面上传递这些信息(如果可能的话通过 JQuery)。
我听说过 .port.emit
的事情,我认为我必须使用它,但我不明白如何使用。
最佳答案
在您的 tabs.open
中调用,添加属性onReady
(还有一些其他 onEvents 可能会起作用)并将其值设置为以下函数:
onReady: function (tab) {
var worker = tab.attach({
contentScriptFile: [self.data.url("jquery-2.1.1.min.js"), self.data.url("panel.js")]
});
worker.port.emit("customEventName", "message");
worker.port.on("otherCustomEventName", function (stringData) {
// Whatever you want to do with string value stringData
});
}
如果要访问 worker = ...
,请使用(更多)全局上下文中的变量( var
不带 worker.port.emit
) onReady
中的函数之外属性(property)。 worker.port.on
是持久的,因此您不需要在函数范围之外创建任何这些。在内容脚本方面,使用 self.port.emit("eventName", messageString)
和self.port.on("mainScriptEventName", function (stringFromMainScript) {/* do whatever */})
。 SQLite 查询将在主脚本中完成。
关于javascript - 在html页面中从sqlite收取数据(addon firefox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897764/