如何在浏览器标签之间传递值?

时间:2012-09-27 09:22:07

标签: firefox tabs firefox-addon clipboard firefox-addon-sdk

我正在尝试将值从一个标签传递到另一个标签。

我尝试了sessionStorage和剪贴板,但到目前为止还没有运气。这是演示和代码:

https://builder.addons.mozilla.org/package/154290/latest/

它尝试做的是获取所选文本,并将其传递给打开的选项卡:

// Create a new context menu item.
var menuItem = contextMenu.Item({
    label: "Check with Proofread Bot",
    context: contextMenu.SelectionContext(),
    contentScript: 'self.on("click", function () {' +
                '  var text = window.getSelection().toString();' +
                '  sessionStorage.setItem("proofread_bot_chrome", text);' +
                '  self.postMessage(text);' +
                        '});',
    onMessage: function(text) {
        clipboard.set(text);
        //sessionStorage.setItem("proofread_bot_chrome", text);
        tabs.open({
          url: "http://proofreadbot.com",
          onOpen: function onOpen(tab) {
            // do stuff like listen for content
            // loading.
            alert(clipboard.get());
            alert(selection.text);
            sessionStorage.setItem("proofread_bot_chrome", clipboard.get());
          }
        });
    }
});

2 个答案:

答案 0 :(得分:1)

sessionStoragelocalStorage始终绑定到域。内容脚本使用网页的特权运行,这意味着它们访问该网页的会话存储 - 对于传递数据并不是非常有用。他们根本没有剪贴板权限。

这意味着您无法绕过“传统”消息传递。当您打开选项卡时,您应该附加一个内容脚本,等待它准备就绪(内容脚本可以发送一条消息来指示)并向其发送文本。像这样:

onOpen: function(tab) {
  var worker = tab.attach({
    contentScript: "self.on('message', function(text) {alert(text);});" +
                   "self.postMessage(null);",
    onMessage: function() {
      worker.postMessage(text);
    }
  });
}

供参考:Communicating using postMessage()

答案 1 :(得分:0)

您应该尝试使用localStorage而不是sessionStorage。 localStorage在同一来源的文档之间共享。 虽然它甚至在关闭标签时仍然存在,根据您的要求,这可能是也可能不是。

sessionStorage是每个文档,因此不在标签之间共享。