如何通过浏览器标签之间的值?(How to pass a value between browser

2019-10-17 06:52发布

我想传递一个值从一个标签到另一个。

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

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

供参考: 使用通讯postMessage()



Answer 2:

你应该尝试的localStorage而不是sessionStorage的。 localStorage的是来自同一产地的文件共享。 虽然仍然存在,甚至在标签接近,根据您的要求可能会或可能不理想。

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



文章来源: How to pass a value between browser tabs?