1

我正在尝试将值从一个选项卡传递到另一个选项卡。

我试过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());
          }
        });
    }
});
4

2 回答 2

1

sessionStorage并且localStorage总是绑定到一个域。内容脚本以网页的权限运行,这意味着它们访问该网页的会话存储 - 对于传递数据不是很有用。他们根本没有剪贴板访问权限。

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

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

供参考:通信使用postMessage()

于 2012-09-28T05:27:45.193 回答
0

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

sessionStorage 是每个文档的,因此不在选项卡之间共享。

于 2012-09-28T05:24:37.303 回答