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

时间:2015-01-21 15:08:18

标签: javascript firefox firefox-addon firefox-addon-sdk

我尝试构建一个基本的插件,它会这样做:

  • 复制页面上几个字段(已填充)的值(不是很好) 现在重要哪一个)
  • 在本地保存值
  • 将保存的值粘贴到类似的表单上(相同的字段具有相同的名称) 等)在另一页(也不是很重要的页面) 现在)。

所以我想到了使用上下文菜单和

  • 一个要复制数据的项目,它执行此操作:
    • 使用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]
});

内容的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);
    }

});

1 个答案:

答案 0 :(得分:2)

好的,我在评论中描述的修改后运行了附加组件。它会在整个会话期间将第一个复制的formData粘贴到特定会话中,即使后续值已被复制也是如此。问题是简单存储变量ss的值仅在开始时更新,并且菜单项value的{​​{1}}属性在创建时被初始化,这也是在开始时间。解决方案是替换

pasteItem

var ss.storage.storedFormData = JSON.stringify(formData);