【问题标题】:Firefox addon: Have content script retrieve data stored by addon script (using a context menu if possible)Firefox 插件:让内容脚本检索插件脚本存储的数据(如果可能,使用上下文菜单)
【发布时间】:2015-01-22 10:09:29
【问题描述】:

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

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

所以我考虑使用上下文菜单并拥有

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

内容脚本.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);
    }

});

【问题讨论】:

  • ss.storage.storedFormData = JSON.stringify(formData);之前你不想要var
  • 另外,data 是未定义的,所以添加一行 var data = require("sdk/self").data;

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


【解决方案1】:

好的,在完成 cmets.xml 中描述的修改后,我运行了插件。它在整个会话中粘贴特定会话中第一个复制的 formData,即使随后的值被复制。问题是简单存储变量ss的值只在启动时更新,而菜单项pasteItemvalue属性在创建时初始化,也是在启动时。解决办法是更换

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

pasteItem.data = ss.storage.storedFormData = JSON.stringify(formData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多