Javascript Firefox插件:让内容脚本检索由插件脚本存储的数据(如果可能,使用上下文菜单)

Javascript Firefox插件:让内容脚本检索由插件脚本存储的数据(如果可能,使用上下文菜单),javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,我尝试构建一个基本插件,它可以做到这一点: 复制页面上几个字段(已填充)的值(不是很重要 重要信息(现在选择哪一个) 在本地保存该值 将保存的值粘贴到类似表单上(相同字段具有相同名称 等)在另一页上(也不是很重要,它是为哪一页 现在) 所以我考虑使用上下文菜单和 要复制数据的一项,它可以执行以下操作: 使用jQuery从页面收集值 然后发送到加载项脚本进行存储 一项用于粘贴数据 接收存储的数据,作为数据发送 用数据填充空字段 我遇到的问题是数据类型和将存储的数据发送到内容脚本 以

我尝试构建一个基本插件,它可以做到这一点:

  • 复制页面上几个字段(已填充)的值(不是很重要 重要信息(现在选择哪一个)
  • 在本地保存该值
  • 将保存的值粘贴到类似表单上(相同字段具有相同名称 等)在另一页上(也不是很重要,它是为哪一页 现在)
所以我考虑使用上下文菜单和

  • 要复制数据的一项,它可以执行以下操作:
    • 使用jQuery从页面收集值
    • 然后发送到加载项脚本进行存储
  • 一项用于粘贴数据
    • 接收存储的数据,作为数据发送
    • 用数据填充空字段
我遇到的问题是数据类型和将存储的数据发送到内容脚本

以下是我到目前为止的情况:

main.js

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);