Javascript Firefox插件:让内容脚本检索由插件脚本存储的数据(如果可能,使用上下文菜单)
我尝试构建一个基本插件,它可以做到这一点:Javascript Firefox插件:让内容脚本检索由插件脚本存储的数据(如果可能,使用上下文菜单),javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,我尝试构建一个基本插件,它可以做到这一点: 复制页面上几个字段(已填充)的值(不是很重要 重要信息(现在选择哪一个) 在本地保存该值 将保存的值粘贴到类似表单上(相同字段具有相同名称 等)在另一页上(也不是很重要,它是为哪一页 现在) 所以我考虑使用上下文菜单和 要复制数据的一项,它可以执行以下操作: 使用jQuery从页面收集值 然后发送到加载项脚本进行存储 一项用于粘贴数据 接收存储的数据,作为数据发送 用数据填充空字段 我遇到的问题是数据类型和将存储的数据发送到内容脚本 以
- 复制页面上几个字段(已填充)的值(不是很重要 重要信息(现在选择哪一个)
- 在本地保存该值
- 将保存的值粘贴到类似表单上(相同字段具有相同名称 等)在另一页上(也不是很重要,它是为哪一页 现在)
- 要复制数据的一项,它可以执行以下操作:
- 使用jQuery从页面收集值
- 然后发送到加载项脚本进行存储
- 一项用于粘贴数据
- 接收存储的数据,作为数据发送
- 用数据填充空字段
var cm = require("sdk/context-menu");
var ss = require("sdk/simple-storage");
// The following gave me a 'Message: SyntaxError: missing ; before statement'
// So I guess I cannot set the stored data like this to be reachable all over
// the addon script...
// var ss.storage.storedFormData = null;
var copyItem = cm.Item({
label: "copy",
data: null
});
// Then here I have 'data is not defined'
var pasteItem = cm.Item({
label: "paste",
data: ss.storage.storedFormData
});
var searchMenu = cm.Menu({
label: "Choose what you want to do",
contentScriptFile: [
data.url('jquery-1.11.2.min.js'),
data.url('content-script.js')
],
onMessage: function (formData) {
console.log('Storing formData');
var ss.storage.storedFormData = JSON.stringify(formData);
},
items: [copyItem, pasteItem]
});
content-script.js
self.on("click", function (node, data) {
if (data === null) {
// 'data' is null = get data from page
var formData = new Object();
// Get elements on page
formData.element1 = $('input#elementId1').val();
formData.element2 = $('input#elementId2').val();
formData.element3 = $('input#elementId3').val();
// Send data to addon script to be stored
self.postMessage(formData);
} else {
// 'data' is not null, populate the page with data
// Retrieve the data
formData = JSON.parse(data);
// Fill the fields with the data
$('input#elementId1').val(formData.element1);
$('input#elementId2').val(formData.element2);
$('input#elementId3').val(formData.element3);
}
});
好的,我在做了注释中描述的修改之后运行了这个附加组件。在整个会话期间,即使复制了后续值,它也会在特定会话中粘贴第一个复制的formData。问题在于,简单存储变量
ss
的值仅在开始时更新,而菜单项pasteItem
的value
属性在创建时也在开始时初始化。解决办法是替换
var ss.storage.storedFormData = JSON.stringify(formData);
与
您不希望在
ss.storage.storedFormData=JSON.stringify(formData)之前使用var
另外,data
未定义,因此添加一行,如var data=require(“sdk/self”).data代码>
pasteItem.data = ss.storage.storedFormData = JSON.stringify(formData);